2011-02-10 39 views
8

Sửa lỗi nếu tôi sai, nhưng MEF chỉ tốt cho việc quản lý một tập hợp những thứ không rõ (plugin) có thể được tự động phát hiện và tự động kết nối. Đối với một dự án tương lai, chúng ta sẽ cần một container IoC đúng để cấu hình một cách rõ ràng các phần đã biết của ứng dụng (nhưng MEF không tốt) nhưng ngoài ra chúng ta cũng cần hỗ trợ các plugin tự động phát hiện (tốt nhất là POCO không có thuộc tính). Có thể một container IoC hỗ trợ điều này một cách dễ dàng/theo mặc định? Nếu vậy bạn có thể đưa ra một gợi ý nhanh về cách thực hiện điều này trong Unity và StructureMap như thế nào? Đó là hai chúng tôi hiện đang ủng hộ. Chúng tôi thực sự muốn tránh sự phụ thuộc vào container IoC MEF.Sử dụng thùng chứa IoC cho kiến ​​trúc plugin

+0

Có gì sai khi sử dụng MEF cho plugin? Nó được thiết kế chính xác cho trường hợp sử dụng đó và một phần của khung công tác .Net. – jeroenh

+0

Hãy xem tại Spring.Net. –

+1

Bạn nói rằng bạn muốn tránh có một container IoC và MEF, vì vậy tôi sẽ không đăng bài này như là một câu trả lời. Nhưng [Autofac] (http://nblumhardt.com/2010/04/introducing-autofac-2-1-rtw/) tích hợp khá tốt với MEF. –

Trả lời

8

Tôi nghĩ rằng điều quan trọng cần lưu ý là mặc dù MEF không phải là một container IoC theo nghĩa thông thường, nó đang thực hiện đảo ngược kiểm soát. Trong thực tế, tôi sẽ không đồng ý với điều đó và nói rằng MEF là một container IoC giống như bất kỳ container nào khác. Sự khác biệt thực sự giữa việc nói Unity và MEF, là MEF theo mặc định hỗ trợ bố cục trên độ phân giải loại rõ ràng và loại khám phá qua cấu hình. Nhưng, như chúng ta đã thấy với dự án MEFContrib, nó hoàn toàn có thể có MEF hoạt động giống như một container IoC truyền thống. MEF cung cấp cho bạn một đường cơ sở tuyệt vời cho hành vi thành phần mô-đun, lấy rất nhiều việc ghép cứng và cách nó được thiết kế, nó cho phép bạn thêm vào nhiều chức năng hơn. Giả sử bạn có codebase hiện tại của bạn được xây dựng xung quanh một vùng chứa IoC khác hoặc định vị dịch vụ, bạn có thể kết nối một số ExportProvider để làm như vậy, bạn có thể kết nối nhà cung cấp với một trình định vị dịch vụ như dự án Common Service Locator và sau đó cắm vào một tương thích Triển khai CSL và có MEF soạn các phần thành phần bằng cách sử dụng các kiểu bắt nguồn từ thùng chứa IoC khác của bạn. MEF cũng thực hiện tiêm phụ thuộc cho bạn.

Nếu bạn muốn tránh có sự phụ thuộc vào một thùng chứa IoC cụ thể hoặc bản thân MEF, bạn luôn có thể sử dụng một cái gì đó giống như Bộ định vị dịch vụ thông thường trừu tượng hóa các hoạt động bình thường. Bằng cách đó nếu bạn cần/muốn thay đổi cách mọi thứ được kết lại với nhau, nó tương đối không đau. Có các triển khai CSL tương thích cho hầu hết các thùng chứa IoC và MEF.

Hy vọng điều đó sẽ hữu ích.

+0

MEF Contrib có cho phép các bộ phận là POCO không có thuộc tính không? – bitbonk

+2

Mô hình được phân bổ chỉ là mô hình lập trình mặc định cho MEF. MEFContrib có một 'ConventionCatalog', kết hợp với' PartRegistry' cho phép bạn đăng ký các loại giống như container như Unity/Autofac/Windsor, v.v. –

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