Używam MEF od jakiegoś czasu, a kluczowym czynnikiem, kiedy używamy go zamiast produktów IOC jest to, że regularnie mamy 3-5 implementacji danego interfejsu, który znajduje się w naszym katalogu wtyczek w danym czasie. Którą z tych implementacji należy użyć, jest to coś, o czym można zadecydować tylko w czasie wykonywania.
MEF dobrze sobie z tym radzi. Zazwyczaj IOC jest nastawiony na upewnienie się, że w pewnym momencie w przyszłości można wymieniać IUserRepository na podstawie produktu ORM 1 dla produktu ORM 2. Jednak większość rozwiązań IOC zakłada, że w danym czasie będzie tylko jedna IUserRepository.
Jeśli jednak trzeba wybrać jeden na podstawie danych wejściowych dla danego żądania strony, kontenery IOC zazwyczaj tracą.
Jako przykład, sprawdzamy nasze uprawnienia i zatwierdzamy przez wtyczki MEF dla dużej aplikacji internetowej, nad którą pracowałem od dłuższego czasu. Korzystając z MEF, możemy przyjrzeć się, kiedy data utworzenia CreatedOn, i wykopać wtyczkę do sprawdzania poprawności, która faktycznie obowiązywała podczas tworzenia rekordu i uruchomić rekord BOTH za pośrednictwem tej wtyczki ORAZ walidatora, który jest aktualnie w użyciu i porównać ważność rekordu czas.
Ten rodzaj mocy pozwala również zdefiniować pominięcia dla wtyczek. Aplikacje, nad którymi pracuję, są właściwie tym samym wdrożeniem kodu dla 30+ implementacji. Tak więc zazwyczaj szukamy wtyczek, prosząc o:
- Implementacja interfejsu, która jest specyficzna dla bieżącej witryny i określonego typu rekordu.
- Implementacja interfejsu, która jest specyficzna dla bieżącej witryny, ale działa z dowolnym typem rekordu.
- Interfejs działający dla dowolnej witryny i dowolnego rekordu.
Pozwala to na dołączenie zestawu domyślnych wtyczek, które zostaną uruchomione, ale tylko wtedy, gdy ta konkretna implementacja nie zastąpi go regułami specyficznymi dla klienta.
IOC to świetna technologia, ale wydaje się, że chodzi o ułatwienie kodowania na interfejsy zamiast konkretnych implementacji. Jednak zamiana tych implementacji jest raczej wydarzeniem typu przesunięcie projektu w IOC. W programie MEF można elastycznie korzystać z interfejsów i konkretnych implementacji, co sprawia, że jest to decyzja dotycząca wykonywania wielu różnych opcji.
Powiązane pytanie [tutaj] (http://stackoverflow.com/questions/411660/enterprise-library-unity-vs-other-ioc-containers) – Benjol