MEF: Übergabe verschiedener Konstruktorparameter an einen Teil bei Verwendung von CreationPolicy.NonShared

9

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:

  1. Gibt es eine andere Möglichkeit, den Wert von SomeParam im obigen Szenario für jede neue Instanz zu ändern?
  2. Wenn nicht, was sind die anderen Möglichkeiten, dies zu erreichen, ohne ein anderes DI-Framework zu verwenden? Eine Sache, die mir in den Sinn kommt, ist, einen Service zu erstellen, um etwas wie 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.
  3. 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?

Danke für jede Hilfe. :)
Grüße,
Yogesh Jagota     

Yogesh 29.03.2012, 18:31
quelle

2 Antworten

2
  

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:

%Vor%     
Wim Coenen 30.03.2012, 08:49
quelle
1

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%
  1. 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%     
RAJ 01.07.2014 18:04
quelle