39

Tôi đã tìm kiếm về tiêm phụ thuộc và đọc một vài bài báo. Nhưng tôi vẫn không thể tìm ra sự khác biệt giữa MEF và các IoC khác. Vì vậy, câu hỏi của tôi là: Trong trường hợp nào tôi nên sử dụng một container MEF hoặc IoC?Sự khác biệt giữa các thùng chứa MEF và IoC (như Unity, Autofac, SMap, Ninject, Windsor.Spring.net, vv)

Vì sao nên sử dụng MEF với PRISM cho (WPF & Silverlight) hoặc cho các ứng dụng dành cho máy tính để bàn?

Trong khi đó, người dùng ứng dụng web sử dụng vùng chứa IoC.

Vì vậy, các tiêu chí để quyết định kỹ thuật phụ thuộc nào tôi nên sử dụng là gì?

Tôi đã xem qua bài viết http://devlicio.us/blogs/casey/archive/2009/12/18/what-is-the-difference-between-an-ioc-container-and-mef.aspx , nhưng tôi không thể xác định bất cứ điều gì.

+1

bài hữu ích: http://stackoverflow.com/questions/216565/why-exactly-isnt-mef-a-di-ioc-container – dugas

+0

@duga nhờ các liên kết, nhưng tôi vẫn muốn biết MEF có thể làm việc với các loại đã biết hay không và Tại sao MEF được sử dụng trong Silverlight và WPF (các mô hình MVVM), cho dù chúng có loại không xác định hay không –

Trả lời

35

Cuối cùng những gì tôi đã kết luận về MEF vs IoC container là như sau:

MEF được ưa thích được sử dụng khi người ta phải đối phó với các loại không rõ hoặc một plugin kiến ​​trúc dựa.

Vùng chứa IoC được ưu tiên sử dụng với các loại đã biết.

Hơn nữa, MEF là một giải pháp kiến ​​trúc cho dependency injection

Trong khi đó, container IoC là giải pháp mã cấp cho dependency injection.

Các thùng chứa IoC chỉ là các kỹ thuật tiêm phụ thuộc, cho phép lớp của lớp đó yêu cầu đối tượng của các lớp khác, sau đó IoC cũng tiêm các đối tượng cần thiết. Nhưng MEF không chỉ tiêm chích phụ thuộc. Mặc dù, MEF cũng sử dụng cách tiếp cận dựa trên IoC để tiêm phụ thuộc, nhưng MEF thực hiện rất nhiều thứ khác ngoài việc tiêm phụ thuộc.

MEF đã có hai thành phần:

  1. Catalogue: Chịu trách nhiệm phát hiện phần mở rộng

  2. container: Cung cấp khả năng tải một phần mở rộng đến một ứng dụng đang chạy

MEF không chỉ là kỹ thuật tiêm phụ thuộc. Nó được sử dụng trong đó chúng ta cần một kiến ​​trúc dựa trên plugin cho ứng dụng của chúng ta, nhưng đồng thời MEF sử dụng một phương pháp dựa trên IoC để tiêm phụ thuộc.

Tôi đang mong nhiều người hơn nhận xét về điều này.

+0

[Here] (https://visualstudiomagazine.com/articles/ 2013/04/01/unity-vs-mef.aspx) là một bài viết hay về sự so sánh này. Kết luận của tác giả cuối cùng hơi đáng sợ - "Tin xấu là, ba tháng sau khi chọn một, bạn sẽ gặp phải một vấn đề sẽ dễ giải quyết hơn với công cụ khác'. – RBT

20

IoC là một chiến lược thiết kế kiến ​​trúc, và MEF là một triển khai thực hiện việc tiêm phụ thuộc mẫu thiết kế. Dependency injection (DI) thường là chiến lược thực hiện của IoC. Thường thì thuật ngữ IoC container được sử dụng, gợi ý rằng IoC là kỹ thuật.

Không, nó là khác. IoC là một khái niệm rộng và DI là mẫu thiết kế để thực hiện cốt lõi của IoC. MEF là một dạng của DI, nhưng nó không phải tất cả các tính năng cơ bản của IoC.

MEF sử dụng bố cục để tìm ra các phụ thuộc cần giải quyết.Đó là giống như rất nhiều container IoC khác, ví dụ như Pico và Spring. Nhưng nó dừng lại ở đó. Tôi không thấy bất kỳ quản lý vòng đời nào cũng như cấu hình tổng hợp. Sau đó hai tôi coi là một phần cơ bản của IoC (không phải của DI), bởi vì hiệu suất của người gọi sẽ không bị ảnh hưởng bởi vì mức tiêu thụ bộ nhớ được sử dụng bởi callee.

Nguyên tắc IoC là dịch vụ cho người gọi và callee bằng cách liên kết lỏng lẻo với họ. Bằng cách đó cả hai chức năng có thể làm việc tối ưu hóa. MEF có thể có vấn đề là có vấn đề với tối ưu hóa. Ví dụ, khi bạn có một cuộc gọi từ trình đơn đến một cơ sở dữ liệu, sau đó tại một thời điểm một cuộc gọi đến cơ sở dữ liệu sẽ được thực hiện. Nó luôn luôn là tốt nhất để sử dụng tổng hợp cho điều đó. MEF không có khả năng làm điều đó.

Loại ứng dụng phải độc lập với lựa chọn cho mẫu thiết kế. Không có sự khác biệt lớn giữa máy tính để bàn hoặc ứng dụng web. Cả hai đều là giao diện người dùng và cả hai đều có thể sử dụng MEF và IoC. Nếu chức năng này đơn giản và không cần phải vượt qua các ranh giới tối ưu hóa (như các cuộc gọi cơ sở dữ liệu), thì MEF là lựa chọn đầu tiên, bởi vì nó là một khung công tác có sẵn khi sử dụng .NET 4. Sau đó, nó có thể hữu ích, nhưng nếu có cuộc gọi vượt qua một ranh giới tối ưu hóa (như phân tích cú pháp hoặc tải lên một tập tin), sau đó việc sử dụng một container IoC là hiệu quả hơn cho hiệu suất và bảo trì.

thông tin tôi đã sử dụng:

Các vấn đề liên quan