39

Szukałem informacji na temat zastrzyku zależności i przeczytałem kilka artykułów. Ale nadal nie jestem w stanie ustalić różnicy między MEF a innymi IoC. Moje pytanie brzmi następująco: w jakiej sytuacji powinienem używać kontenera MEF lub IoC?Różnica między kontenerami MEF i IoC (takimi jak Unity, Autofac, SMap, Ninject, Windsor.Spring.net, itp.)

Dlaczego warto używać MEF z PRISM dla (WPF & Silverlight) lub dla aplikacji komputerowych?

Podczas gdy w aplikacji internetowej ludzie używają kontenerów IoC.

Jakie są kryteria wyboru techniki zależności, której powinienem użyć?

Przeczytałem artykuł http://devlicio.us/blogs/casey/archive/2009/12/18/what-is-the-difference-between-an-ioc-container-and-mef.aspx , ale nie mogłem niczego ustalić.

+1

pomocna postu: http://stackoverflow.com/questions/216565/why-exactly-isnt-mef-a-di-ioc-container – dugas

+0

@duga dzięki za link ale nadal chcę wiedzieć, że MEF może pracować ze znanymi typami i dlaczego i dlaczego MEF jest używany w Silverlight i WPF (modele MVVM), czy mają nieznane typy czy nie –

Odpowiedz

35

końcu co ja zawarły o MEF vs IoC kontenera jest następująca:

MEF jest korzystny do stosowania, gdy ma się do czynienia z nieznanych typów lub architekturze opartej na wtyczki.

Kontenery IoC są preferowane do stosowania ze znanymi typami.

Ponadto MEF jest roztworem do iniekcji architektonicznych zależności

Natomiast pojemniki IoC są roztwory kodu poziomu do uzależnienia.

Kontenery IoC to tylko techniki zastępowania zależności, które zapełniają wystąpienie klasy i jeśli konstruktor tych klas wymaga obiektów innych klas, wówczas IoC także wstrzykuje wymagane obiekty. Ale MEF robi coś więcej niż tylko wstrzyknięcie zależności. Chociaż MEF używa również podejścia opartego na IoC do wstrzykiwania zależności, ale MEF robi tak wiele innych rzeczy oprócz iniekcji zależności.

MEF ma dwa składniki:

  1. katalogowy: Jest odpowiedzialny za odkrycie rozszerzenie

  2. opakowaniu: Umożliwia załadowanie rozszerzenia do uruchomionego aplikacji

MEF to coś więcej niż tylko techniki wstrzykiwania zależności. Używa się go, gdy potrzebujemy architektury opartej na wtyczce dla naszej aplikacji, ale jednocześnie MEF stosuje podejście oparte na IoC dla wtrysku zależności.

Spodziewam się, że więcej osób wypowie się na ten temat.

+0

[tutaj] (https://visualstudiomagazine.com/articles/ 2013/04/01/unity-vs-mef.aspx) jest dobrym artykułem na temat tego porównania. Ostatecznie wniosek autora jest nieco przerażający - "Zła wiadomość jest taka, że ​​trzy miesiące po jej wybraniu napotkasz problem, który łatwiej byłoby rozwiązać za pomocą innego narzędzia". – RBT

20

IoC to strategia projektowania architektonicznego, a MEF jest implementacją iniekcji zależności wzoru. Wstrzyknięcie zależności (DI) jest często strategią wdrażania IoC. Często używa się terminu IoC container, co sugeruje, że IoC jest techniką.

Nie, jest inaczej. IoC jest szeroką koncepcją, a DI jest wzorcem do implementacji rdzenia IoC. MEF jest pewną formą DI, ale nie ma wszystkich podstawowych cech IoC.

MEF używa składu, aby znaleźć zależności, które musi rozwiązać.Jest to podobne do wielu innych kontenerów IoC, na przykład Pico i Spring. Ale to się zatrzymuje. Nie widziałem żadnego zarządzania cyklem życia ani konfiguracji łączenia. Te dwie ostatnie uważam za podstawową część IoC (nie DI), ponieważ wydajność dzwoniącego nie powinna ucierpieć z powodu zużycia pamięci przez odbiorcę.

Zasada IoC jest usługą dla osoby dzwoniącej i osoby odwiedzającej poprzez luźne łączenie ich. W ten sposób obie funkcje mogą być zoptymalizowane. MEF może mieć problem z problemami z optymalizacją. Na przykład, gdy masz połączenie z menu do bazy danych, to w pewnym momencie nastąpi wywołanie do bazy danych. Zawsze najlepiej jest użyć tego do łączenia. MEF nie jest w stanie tego zrobić.

Rodzaj aplikacji powinien być niezależny od wyboru wzoru projektu. Nie ma dużej różnicy między komputerem a aplikacją internetową. Oba są interfejsami użytkownika, a oba powinny być w stanie używać MEF i IoC. Jeśli funkcjonalność jest prosta i nie musi przekraczać granic optymalizacji (takich jak wywołania bazy danych), to MEF jest pierwszym wyborem, ponieważ jest to framework, który jest obecny podczas korzystania z .NET 4. Wtedy może być użyteczny, ale jeśli połączenie przekracza granicę optymalizacji (jak parsowanie lub przesyłanie pliku), a następnie użycie kontenera IoC jest bardziej owocne pod względem wydajności i konserwacji.

Informacja użyłem: