MEF vs. any IoC

Patrząc na Microsoft Managed Extensibility Framework (MEF) i różne kontenery IoC (takie jak Unity), nie widzę, kiedy używać jednego typu rozwiązania nad drugim. Mówiąc dokładniej, wydaje się, że MEF obsługuje większość wzorców typów IoC I że kontener IoC, taki jak Unity, nie byłby tak potrzebny.

Idealnie, chciałbym zobaczyć dobry przypadek użycia, w którym kontener IoC byłby używany zamiast, lub jako dodatek do, MEF.

Author: Robert Harvey, 2009-08-17

4 answers

Po skompilowaniu, główna różnica polega na tym, że kontenery IoC są na ogół najbardziej przydatne z zależnościami statycznymi (znanymi w czasie kompilacji), a MEF jest na ogół najbardziej użyteczny z zależnościami dynamicznymi (znanymi tylko w czasie wykonywania).

Jako takie, oba są silnikami kompozycji, ale nacisk jest bardzo różny dla każdego wzoru. Decyzje projektowe są więc bardzo zróżnicowane, ponieważ MEF jest zoptymalizowany pod kątem odkrywania nieznanych części, a nie rejestracji znanych części.

Przemyśl to w ten sposób: jeśli tworzysz całą aplikację, kontener IoC jest prawdopodobnie najlepszy. Jeśli piszesz o rozszerzalności, takiej, że deweloperzy zewnętrzni będą rozszerzać Twój system, MEF jest prawdopodobnie najlepszy.

Również artykuł w odpowiedzi @ Pavel Nikolov ' a dostarcza jakiegoś świetnego kierunku (napisał go Glenn Block, menedżer programu MEF).

 73
Author: Bryan Watts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-20 00:48:50

Używam MEF od jakiegoś czasu i kluczowym czynnikiem, kiedy używamy go zamiast produktów IOC jest to, że regularnie mamy 3-5 implementacji danego interfejsu siedzi w naszym katalogu wtyczek w danym czasie. Która z tych implementacji powinna być użyta, jest w rzeczywistości czymś, o czym można decydować tylko w czasie wykonywania.

MEF dobrze ci na to pozwala. Zazwyczaj IOC jest nastawiony na upewnienie się, że można wymienić, na przykład stożkowy, IUserRepository oparte na ORM produkt 1 dla ORM produkt 2 w pewnym momencie w przyszłości. Jednak większość rozwiązań MKOl zakłada, że w danym czasie będzie działać tylko jeden IUserRepository.

Jeśli jednak musisz wybrać jedną z nich na podstawie danych wejściowych dla danego żądania strony, kontenery IOC są zazwyczaj nieaktualne.

Jako przykład, robimy nasze sprawdzanie uprawnień i naszą walidację za pomocą wtyczek MEF dla dużej aplikacji internetowej, nad którą pracuję od jakiegoś czasu. Używając MEF, możemy przyjrzeć się, kiedy płyta jest CreatedOn Data i idź kopać w poszukiwaniu wtyczki walidacji, która faktycznie była w mocy, gdy rekord został utworzony i uruchom rekord zarówno za pomocą tej wtyczki, jak i walidatora, który jest obecnie w mocy i porównaj Ważność rekordu w czasie.

Ten rodzaj mocy pozwala nam również definiować nadpisania fallthrough dla wtyczek. Aplikacje, nad którymi pracuję, są w rzeczywistości tymi samymi bazami kodowymi wdrożonymi dla ponad 30 wdrożeń. Tak więc zazwyczaj szukamy wtyczek, pytając za:

  1. implementacja interfejsu, która jest specyficzna dla bieżącej witryny i określonego typu rekordu, o którym mowa.
  2. implementacja interfejsu, która jest specyficzna dla bieżącej witryny, ale działa z każdym rodzajem rekordu.
  3. interfejs, który działa dla każdej witryny i dowolnego rekordu.

To pozwala nam spakować zestaw domyślnych wtyczek, które zaczną działać, ale tylko wtedy, gdy ta konkretna implementacja nie nadpisuje jej regułami specyficznymi dla klienta.

Jest świetną technologią, ale naprawdę wydaje się bardziej ułatwiać kodowanie interfejsów zamiast konkretnych implementacji. Jednak zamiana tych implementacji jest bardziej wydarzeniem typu project shift w IOC. W MEF, bierzesz elastyczność interfejsów i konkretnych implementacji i sprawiają, że decyzja o uruchomieniu między wieloma dostępnymi opcjami.

 26
Author: J Wynia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-10 20:14:29

Przepraszam za bycie poza tematem. Chciałem tylko powiedzieć, że są 2 wady, które sprawiają, że MEF jest niepotrzebną komplikacją:

  • Jest to oparte na atrybutach, które nie robią nic dobrego, aby pomóc ci dowiedzieć się, dlaczego rzeczy działają tak, jak robią. Nie ma sposobu, aby dotrzeć do szczegółów zakopanych we wnętrzu frameworka, aby zobaczyć, co dokładnie się tam dzieje. Nie ma sposobu, aby uzyskać dziennik śledzenia lub podłączyć się do mechanizmów rozwiązywania i radzić sobie z nierozwiązanymi sytuacjami ręcznie

  • Nie ma żadnego mechanizmu rozwiązywania problemów, aby dowiedzieć się, dlaczego niektóre części są odrzucane. Pomimo wskazywania na wadliwą część, nie mówi ci, dlaczego ta część się nie powiodła.

Więc jestem bardzo rozczarowany. Spędziłem zbyt dużo czasu walcząc z wiatrakami próbując uruchomić kilka klas zamiast pracować nad prawdziwymi problemami. Przekonałem się, że nie ma nic lepszego niż oldschoolowa technika wtrysku uzależnień, gdy masz pełne kontrola nad tym, co jest tworzone, kiedy i może śledzić wszystko w DEBUGGERZE VS. Chciałbym, żeby ktoś, kto opowiada się za MEF przedstawił kilka dobrych powodów, dlaczego wybrałbym go zamiast zwykłego DI.

 5
Author: Aleksey Bykov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-30 20:34:10

Zgadzam się, że MEF może być w pełni sprawnym frameworkiem MKOl. W rzeczywistości piszę teraz aplikację opartą na użyciu MEF zarówno dla rozszerzalności, jak i IoC. Wziąłem jego ogólne części i zrobiłem z niego "framework" i udostępniłem go jako własny framework o nazwie Soapbox Core na wypadek, gdyby ludzie chcieli zobaczyć, jak to działa.

W szczególności, przyjrzyj się, jak działa Host , jeśli chcesz zobaczyć MEF w akcji.

 1
Author: Scott Whitlock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-07 03:21:42