39

Ich habe über die Abhängigkeitsinjektion gesucht und ein paar Artikel gelesen. Aber ich kann immer noch nicht den Unterschied zwischen MEF und anderen IoCs herausfinden. Meine Frage lautet also: In welcher Situation sollte ich lieber einen MEF- oder IOC-Container verwenden?Unterschied zwischen MEF und IoC-Container (wie Unity, Autofac, SMap, Ninject, Windsor.Spring.net, etc.)

Warum ist es gut, MEF mit PRISM für (WPF & Silverlight) oder für Desktop-Anwendungen zu verwenden?

Während in Web-Anwendung Menschen IoC-Container verwenden.

Also, was ist das Kriterium zu entscheiden, welche Abhängigkeitstechnik ich verwenden soll?

Ich habe durch den Artikel http://devlicio.us/blogs/casey/archive/2009/12/18/what-is-the-difference-between-an-ioc-container-and-mef.aspx , aber ich konnte nichts feststellen.

+1

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

+0

@duga danke für den Link, aber ich möchte immer noch wissen, dass MEF mit bekannten Typen arbeiten kann und warum MEF in Silverlight und WPF (MVVM-Modellen) verwendet wird, ob sie unbekannte Typen haben oder nicht –

Antwort

35

Schließlich, was ich über die MEF vs IoC-Container geschlossen haben, ist wie folgt:

MEF bevorzugt wird, verwendet werden, wenn man mit unbekannten Typen oder ein Plugin-basierte Architektur zu tun hat.

IoC-Container werden bevorzugt mit bekannten Typen verwendet.

Außerdem MEF ist eine architektonische Lösung für Dependency Injection

Während, IoC Container sind Code-Level-Lösungen für Dependency Injection.

IoC-Container sind nur Dependency-Injection-Techniken, die die Instanz einer Klasse auffüllen, und wenn der Konstruktor dieser Klassen Objekte anderer Klassen benötigt, dann injiziert IoC auch die erforderlichen Objekte. Aber MEF leistet mehr als nur die Abhängigkeitsinjektion. Zwar verwendet MEF auch einen IoC-basierten Ansatz für die Abhängigkeitsinjektion, aber MEF macht so viele andere Dinge, abgesehen von der Abhängigkeitsinjektion.

MEF hat zwei Komponenten bekam:

  1. Katalog: Ist verantwortlich für Erweiterung entdecken

  2. Container: Bietet die Möglichkeit,

eine Erweiterung einer Lauf Anwendung zu laden MEF ist mehr als nur Abhängigkeits-Injektionstechniken. Es wird verwendet, wenn wir eine pluginbasierte Architektur für unsere Anwendung benötigen, aber gleichzeitig verwendet MEF einen IoC-basierten Ansatz für die Abhängigkeitsinjektion.

Ich erwarte mehr Leute zu kommentieren.

+0

[Here] (https://visualstudiomagazine.com/articles/ 2013/04/01/unity-vs-mef.aspx) ist ein guter Artikel zu diesem Vergleich. Die Schlussfolgerung des Autors am Ende ist ein wenig beängstigend - "Die schlechte Nachricht ist, dass drei Monate nach der Auswahl ein Problem auftaucht, das mit dem anderen Tool leichter zu lösen wäre". – RBT

20

IoC ist eine architektonische Entwurfsstrategie, und MEF ist eine Implementierung der Entwurfsmusterabhängigkeitsinjektion. Dependency Injection (DI) ist oft die Implementierungsstrategie von IoC. Oft wird der Begriff IoC-Container verwendet, was darauf hindeutet, dass IoC die Technik ist.

Nein, es ist anders. IoC ist ein breites Konzept und DI ist das Entwurfsmuster, um den Kern von IoC zu implementieren. MEF ist eine Form von DI, aber es hat nicht alle grundlegenden Merkmale von IoC.

MEF verwendet Komposition, um die Abhängigkeiten zu ermitteln, die es beheben muss.Das ist ähnlich wie bei vielen anderen IoC-Containern, zum Beispiel Pico und Spring. Aber es hört dort auf. Ich habe weder ein Life-Cycle-Management noch eine Pooling-Konfiguration gesehen. Die beiden letzteren halte ich für einen wesentlichen Bestandteil von IoC (nicht von DI), da die Leistung des Anrufers nicht durch den Speicherverbrauch des Angerufenen beeinträchtigt werden sollte.

Das IoC-Prinzip ist eine Dienstleistung für den Anrufer und den Angerufenen durch lose Kopplung. So können beide Funktionalitäten optimal arbeiten. MEF hat möglicherweise das Problem, dass Probleme bei der Optimierung auftreten. Zum Beispiel, wenn Sie einen Anruf von dem Menü zu einer Datenbank haben, dann wird irgendwann ein Anruf an die Datenbank gemacht werden. Es empfiehlt sich immer, das Pooling zu verwenden. MEF ist dazu nicht in der Lage.

Die Art der Anwendung sollte unabhängig von der Wahl für ein Design-Muster sein. Es gibt keinen großen Unterschied zwischen einer Desktop- oder einer Webanwendung. Beides sind Benutzeroberflächen, und beide sollten in der Lage sein, MEF und IoC zu verwenden. Wenn die Funktionalität einfach ist und keine Optimierungsgrenzen überschreiten muss (wie Datenbankaufrufe), dann ist MEF die erste Wahl, weil es ein Framework ist, das bei der Verwendung von .NET 4 vorhanden ist. Dann könnte es nützlich sein, aber wenn ein Aufruf Überschreitet eine Optimierungsgrenze (wie das Parsen oder Hochladen einer Datei), dann ist die Verwendung eines IoC-Containers für die Leistung und Wartung ergiebiger.

Informationen I verwendet: