2 Stimmen

Ist MEF eine Alles-oder-Nichts-Angelegenheit?

Ich hatte in letzter Zeit ein paar Fragen zum MEF, aber hier ist die wichtigste: Ist es wirklich alles oder nichts, wie es scheint?

Meine grundlegende Anwendungsstruktur ist einfach eine Anwendung, mehrere gemeinsam genutzte Bibliotheken, die als Singletons gedacht sind, und mehrere verschiedene Plugins (die unterschiedliche Schnittstellen implementieren können). Die App lädt die Plugins, und sowohl die App als auch alle Plugins müssen auf die gemeinsam genutzten Bibliotheken zugreifen.

Mein erster Versuch mit MEF war ziemlich erfolgreich, obwohl ich einige dumme Fehler gemacht habe, weil ich so viele verschiedene Dinge ausprobiert habe, dass ich manchmal einfach durcheinander kam. Aber am Ende habe ich gestern Abend meine kleine Testanwendung mit MEF, einigen gemeinsamen Bibliotheken und einem Plugin zum Laufen gebracht.

Jetzt gehe ich zur Zielanwendung über, die ich bereits beschrieben habe. Und es ist die mehrere Plugins Teil, der ein bisschen besorgt sein hat.

Meine bestehende Anwendung unterstützt bereits mehrere Plugins mit unterschiedlichen Schnittstellen durch die Verwendung von Reflection. Ich muss in der Lage sein, jedes Plugin eindeutig zu identifizieren, damit der Benutzer eines auswählen und das erwartete Verhalten dieses Plugins abrufen kann. Das Problem ist, dass ich nicht weiß, wie dies noch zu tun... aber das ist das Thema einer anderen Frage.

Idealerweise würde ich in der Lage sein, meine bestehenden Plugin-Loader zu nehmen und verwenden Sie es als-is, während auf MEF, die gemeinsame Bibliothek Auflösung zu tun verlassen. Das Problem ist, ich kann nicht scheinen, um MEF zu bekommen, um sie zu laden (d.h. ich bekomme eine CompositionException beim Aufruf ComposeParts()), es sei denn, ich auch MEF verwenden, um das Plugin zu laden. Und wenn ich dies tue, gut... dann muss ich wissen, wie sie zu verfolgen, wie sie geladen werden, so dass der Benutzer eine aus einer Liste von Plugins auswählen kann.

Welche Erfahrungen haben Sie mit dem Versuch gemacht, diese Ansätze zu kombinieren?

4voto

Wim Coenen Punkte 64891

MEF ist so konzipiert, dass Sie Plugin-Assemblies einfach laden können. Wenn Sie die Kontrolle über die Plugins haben (was bedeutet, dass Sie MEF-Exportattribute hinzufügen können), brauchen Sie keinen eigenen Plugin-Loader, der Reflection verwendet. MEF macht das alles für Sie.

Abgesehen davon ist es durchaus möglich, MEF mit anderen Technologien zu kombinieren. Ihr Problem scheint zu sein, dass Sie, wenn Sie Ihren eigenen Plugin-Loader verwenden, diese Plugins nicht in den MEF-Container einfügen. Infolgedessen erhalten Sie eine CompositionException für Teile, die versuchen, das ausgewählte Plug-in zu importieren.

Um ein Plugin, das Sie mit Ihrem eigenen Code geladen haben, dem MEF-Container hinzuzufügen, können Sie die ComposeExportedValue wie diese:

container.ComposeExportedValue<IPlugin>(selectedPlugin);

を編集します。 Jetzt verstehe ich, was Sie mit "alles oder nichts" meinen. Ihr Problem ist, dass Sie, um Teile mit MEF importieren zu können, auch das Objekt mit MEF konstruieren müssen. Dieses Problem wirkt sich dann kaskadenartig auf das Objekt aus, das dieses Objekt normalerweise erstellt hat, usw. bis hin zum Anwendungsstamm.

Um diesen "Alles-oder-Nichts"-Effekt zu vermeiden, können Sie einen Kompromiss eingehen, indem Sie den MEF-Container als globale Variable (d. h. als statisches Feld) offenlegen. Auf diese Weise können Klassen auf den MEF-Container zugreifen und Exporte aus ihm abrufen, z. B. durch den Aufruf Program.Container.GetExportedValue<MyDependency>() im Konstruktor.

bearbeiten2 : Wenn Sie ein Objekt haben, das nicht von MEF konstruiert wurde, gibt es zwei Möglichkeiten, es dem Container hinzuzufügen.

Die erste ist der Aufruf container.ComposeExportedValue<IMyContractType>(myObject); .

Die zweite Möglichkeit besteht darin, das Objekt in einem Property-Getter zurückzugeben und dann die Eigenschaft selbst mit einem [Export(typeof(SomeType))]-Attribut zu kennzeichnen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X