Ich weiß, dass es viele Fragen bezüglich der Konstruktorparameterinjektion mit MEF gab, aber meine ist ein bisschen anders.
Ich möchte wissen, dass es eine Möglichkeit gibt, verschiedene Parameterwerte an den Konstruktor eines Teils zu übergeben, wenn ich die Kombination von PartCreationPolicy(CreationPolicy.NonShared)
und GetExportedValue
verwende?
Zum Beispiel:
%Vor%und woanders ...
%Vor% Im obigen Beispiel kann ich ComposeExportedValue
nur einmal verwenden, da es ein ChangeRejectedException
verursacht, wenn es ein zweites Mal ausgeführt wird.
Also, meine Fragen sind:
SomeParam
im obigen Szenario für jede neue Instanz zu ändern? System.Collections.Concurrent.ConcurrentQueue
zu enthüllen, wobei ich einen Parameterwert vor dem Aufruf von GetExportedValue
einreibe und dann den Wert im Konstruktor des Teils enterprise. Aber das ist ein Hack und schafft auch mehr Probleme, als es löst. Danke für jede Hilfe. :)
Grüße,
Yogesh Jagota p>
Wenn die Antwort auf beide obigen Fragen nein ist, gibt es dann noch andere Möglichkeiten, dies mit einer Kombination aus MEF und einem anderen DI / IOC-Framework zu erreichen?
Ich denke, die Antwort auf Frage 1 und 2 ist in der Tat nein.
Ich würde AutoFac ausprobieren, was Ihnen eine feinere Kontrolle und integriert sich mit MEF . Zum Beispiel können Sie Registrierungen wie diese einrichten, so dass Bar
und Baz
Instanzen ihre Foo
Instanz mit einem anderen Parameter erhalten:
Wenn Sie verschiedene Instanzen der gleichen Schnittstelle verwenden möchten, abhängig von einer Logik (Anwendungsstrategie anwenden) in MEF, um das ExportMetadata-Attribut zu verwenden. Zum Beispiel, wenn Sie IDBManager haben und wenn Sie zwei Implementierungen davon haben, dann Oracle und One SQL 1. Erstellen Sie eine Metadatenschnittstelle, die Metadaten enthält
%Vor%2. Erstellen Sie die Attributklasse wie folgt
%Vor%Strategiebeispiel
public enum DataProvider { Orakel, Sql, } [InheritedExport] Öffentliche Schnittstelle IDBManager { Leere initialisieren (); }
[InheritedExport (typeof (IDbManager))] Öffentliche Klasse DbManager: IDbManager { öffentlicher DbManager (DataProvider providerType) { _providerType = AnbieterTyp; }
%Vor%}
Und zwei verschiedene Implementierungen
%Vor%Und
%Vor%Und Sie können entscheiden, welches Sie verwenden möchten, indem Sie die Metadaten-Schnittstelle verwenden, die wir im ersten Schritt erstellt haben, wie im unten gezeigten Repository
%Vor%Tags und Links c# dependency-injection inversion-of-control mef