2011-02-10 13 views
8

Popraw mnie, jeśli się mylę, ale MEF tylko jest dobry do zarządzania zestawem nieznanych rzeczy (wtyczek), które mogą być automatycznie wykryte i automatycznie podłączone. W przypadku przyszłego projektu będziemy potrzebować prawdziwego kontenera IoC, aby jawnie skonfigurować znane części aplikacji (w których MEF nie jest dobry), ale dodatkowo musimy również wspierać automatycznie wykryte wtyczki (najlepiej POCO bez atrybutów, jeśli jest to możliwe). Czy kontener IoC może to łatwo/domyślnie obsłużyć? Jeśli tak, to możesz podać krótką wskazówkę, jak to zrobić w Unity i StructureMap? To są dwie, które obecnie preferujemy. Naprawdę chcielibyśmy uniknąć zależności od kontenera IoC i MEF.Użyj kontenera IoC dla architektury wtyczki

+0

Co jest nie tak z używaniem MEF do wtyczek? Jest zaprojektowany dokładnie dla tego przypadku użycia i jego części ramy .Net. – jeroenh

+0

Spójrz na Spring.Net. –

+1

Powiedziałeś, że chcesz uniknąć pojemnika IoC i MEF, więc nie będę tego publikował jako odpowiedzi. Ale [Autofac] (http://nblumhardt.com/2010/04/introducing-autofac-2-1-rtw/) integruje się całkiem dobrze z MEF. –

Odpowiedz

8

Myślę, że ważne jest, aby pamiętać, że podczas gdy MEF nie jest kontenerem IoC w konwencjonalnym sensie, wykonuje inwersję kontroli. W rzeczywistości nie zgodziłbym się z tym i powiedziałbym, że MEF to kontener IoC, jak każdy inny. Prawdziwa różnica między słowami Jedność i MEF polega na tym, że MEF domyślnie obsługuje kompozycję w porównaniu do jawnej rozdzielczości typu i wykrywa wykrywanie przez konfigurację. Ale, jak widzieliśmy w projekcie MEFContrib, możliwe jest, że MEF zachowuje się bardziej jak tradycyjny kontener IoC. MEF zapewnia doskonałą podstawę do modularnego zachowania komponentów, zabiera wiele trudnych przeszczepów i sposób, w jaki jest zaprojektowany, pozwala na dodanie do niego większej funkcjonalności. Załóżmy na przykład, że twoja istniejąca baza kodów zbudowana jest wokół innego kontenera IoC lub lokalizatora usług, możesz to zrobić, aby móc to zrobić, możesz podłączyć dostawcę do lokalizatora usług, takiego jak projekt Common Service Locator, a następnie podłączyć zgodny Implementacja CSL i komponowanie elementów MEF przy użyciu typów pochodzących z innego kontenera IoC. MEF wykonuje również zastrzyk zależności dla ciebie.

Jeśli chcesz uniknąć zależności od konkretnego kontenera IoC lub samego MEF, zawsze możesz użyć czegoś takiego jak typowy serwisowy obiekt, który jest abstrakcją w stosunku do typowych operacji kontenerowych. W ten sposób, jeśli potrzebujesz/chcesz zmienić sposób, w jaki wszystko jest połączone razem, jest stosunkowo bezbolesny. Istnieją kompatybilne implementacje CSL dla większości kontenerów IoC i MEF.

Nadzieję, że pomaga.

+0

Czy MEF Contrib pozwala częściom na POCO bez atrybutów? – bitbonk

+2

Przypisany model jest domyślnym modelem programowania MEF. MEFContrib ma 'ConventionCatalog', który w połączeniu z' PartRegistry' pozwala na rejestrowanie typów takich jak np. Unity/Autofac/Windsor itp. –

Powiązane problemy