Erhalte nur notwendige Plugins mit MEF in .NET

8

Ich habe IMessageSender-Schnittstelle.

%Vor%

Und ich habe zwei Plugins, die diese Schnittstelle implementieren. Das ist plugin.cs.

%Vor%

und das ist plugin2.cs

%Vor%

Und ich habe diesen Code, um diese Plugins mit MEF laufen zu lassen.

%Vor%

Nach der Kompilation bekomme ich, was ich will.

%Vor%

Meine Frage ist, wie kann ich selektiv von vielen Plugins ausgehen. In diesem Beispiel werden nur alle verfügbaren Plugins aufgerufen, um sie auszuführen, aber was soll ich tun, wenn ich nur das erste oder zweite Plugin ausführen möchte?

Kann ich zum Beispiel nur plugin2.dll wie folgt ausführen?

%Vor%

Gelöst

Basierend auf dieser Website und Matthew Abbotts Antwort. Ich könnte diesen Arbeitscode entwickeln.

Schnittstellencode (interface.cs)

%Vor%

Plugin-Code (Plugin.cs ...)

%Vor%

Programm.cs

%Vor%     
prosseek 14.06.2011, 21:07
quelle

1 Antwort

19

MEF unterstützt den Export von benutzerdefinierten Metadaten, die zu Ihren exportierten Typen gehören. Was Sie tun müssen, ist zuerst eine Schnittstelle zu definieren, die MEF verwendet, um ein Proxy-Objekt zu erstellen, das Ihre Metadaten enthält. In Ihrem Beispiel benötigen Sie wahrscheinlich für jeden Export einen eindeutigen Namen, damit wir definieren können:

%Vor%

Was Sie dann tun müssten, ist sicherzustellen, dass Sie diese Metadaten für jeden Ihrer Exporte, die dies erfordern, zuweisen:

%Vor%

Was MEF tun wird, ist ein Projekt und eine Implementierung Ihrer Schnittstelle zu generieren, INameMetadata mit dem Wert, der in ExportMetadata("Name", "EmailSender1") attribute gespeichert ist.

Nachdem du das gemacht hast, kannst du ein wenig filtern, also definiere dein [Import] zu etwas wie:

%Vor%

Was MEF erstellen wird, ist ein Enumerable von Lazy<T, TMetadata> -Instanzen, die eine verzögerte Instanziierung Ihres Instanztyps unterstützen. Wir können abfragen als:

%Vor%

Wird dies mit dem Argument "EmailSender1" für den Parameter name ausgeführt, wird unsere Instanz von EmailSender zurückgegeben. Es ist wichtig zu beachten, wie wir eine bestimmte Instanz ausgewählt haben, basierend auf der Abfrage der dem Typ zugeordneten Metadaten.

Sie können noch einen Schritt weiter gehen und die Attribute Export und ExportMetadata zu einem einzigen Attribut zusammenfassen, etwa:

%Vor%

Dies ermöglicht uns, ein einzelnes Attribut zu verwenden, um einen Typ zu exportieren und dabei zusätzliche Metadaten bereitzustellen:

%Vor%

Offensichtlich stellt eine solche Abfrage eine Designentscheidung dar. Die Verwendung von Lazy<T, TMetadata> instances bedeutet, dass Sie die Instanziierung der Instanz verzögern können, aber das bedeutet, dass nur eine Instanz pro Lazy erstellt werden kann. Die Silverlight-Variante des MEF-Frameworks unterstützt auch den ExportFactory<T, TMetadata> -Typ, mit dem Sie jedes Mal neue Instanzen von T hochfahren können, während Sie immer noch den umfangreichen Metadaten-Mechanismus erhalten.

    
Matthew Abbott 14.06.2011, 22:10
quelle

Tags und Links