Frage

Ich versuche Konstrukteurs MEF Attribut Injection, um herauszufinden. Ich habe keine Ahnung, wie ich sagen, dass es die Konstrukteurs-Parameter zu laden.

Dies ist die Eigenschaft I zu laden bin versucht,

[ImportMany(typeof(BUsers))]
public IEnumerable<BUsers> LoadBUsers { get; set; }

Hier ist der Code, den ich mit den Baugruppen zu importieren.

try
{
    var catalog = new AggregateCatalog();
    catalog.Catalogs.Add(new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()));
    catalog.Catalogs.Add(new DirectoryCatalog("DI")); 
    var container = new CompositionContainer(catalog);
    container.ComposeParts(this);
}

Hier ist die Klasse I zu laden bin versucht,

[Serializable]
[Export(typeof(BUsers))]
public class EditProfile : BUsers
{
    [ImportingConstructor]
    public EditProfile(string Method, string Version)
    {            
        Version = "2";
        Action = "Edit";
        TypeName = "EditProfile";
    }
War es hilfreich?

Lösung

Wenn Sie das ImportingConstructor Attribut verwenden, werden die Parameter an den Konstruktor Importe. Standardmäßig, was Sie importieren (den Vertrag Name) basiert auf dem Typ des Parameters oder Eigenschaft, die Ihr in importieren. Also in diesem Fall des Vertragstyp sowohl für Ihre Importe ist string, und es gibt keinen wirklichen Unterschied zwischen dem ersten und den zweiten Parameter.

Es sieht aus wie Sie versuchen, Importe zu verwenden, um Konfigurationswerte zu liefern, die nicht unbedingt ist, was es entworfen wurde. Um es zu erhalten zu tun, was Sie wollen, sollten Sie den Vertrag Name außer Kraft setzen für jeden der Parameter, wie folgt aus:

[ImportingConstructor]
public EditProfile([Import("Method")] string Method, [Import("Version")] string Version)
{ }

Dann müssen Sie Exporte für Methode und Version in Ihrem Container. Eine Möglichkeit, dies zu tun ist, nur um sie direkt hinzuzufügen:

var container = new CompositionContainer(catalog);
container.ComposeExportedValue("Method", "MethodValue");
container.ComposeExportedValue("Version", "2.0");
container.ComposeParts(this);

(Beachten Sie, dass ComposeExportedValue ist eigentlich eine Erweiterung Methode auf der statischen AttributedModelServices Klasse definiert.)

Wenn Sie diese Werte aus einer Konfigurationsdatei von einer Art lesen möchten, können Sie Ihre eigenen Export-Provider erstellen, die die Konfiguration liest und liefert die Werte darin als die Ausfuhren in die Behälter.

Eine alternative Möglichkeit, dies wäre zu behandeln, um nur eine Schnittstelle zu importieren, die den Zugriff auf die Konfigurationswert nach Namen liefern und erhalten Sie die Werte, die Sie aus dem Körper des Konstruktors müssen.

Andere Tipps

Ich mag Daniel-Lösung; jedoch nur eine Sache, die ich sehe, ist die enge Kopplung von Parameternamen zwischen dem Schauspieler und Export Teil mit [ImportingConstructor] für kundenspezifische CTOR (die CompopositionContrainer () erzeugt). Zum Beispiel, „Method“ hat zwei an beiden Stellen angepasst werden. Es macht schwer, den Export Teil, wenn der Schauspieler und Export Teil ist in Differenz-Projekten zu erhalten.

Wenn es möglich ist, würde ich die zweite CTOR zum Export Teil Klasse hinzuzufügen. Zum Beispiel:

[Export(typeof(BUsers))] 
public class EditProfile : BUsers
{
    [ImportingConstructor]
    public EditProfile(EditProfileParameters ctorPars)
    : this(ctorPars.Method, ctorPars.Version) {}

    public EditProfile(string Method, string Version)
    {
        Version = "2";
        Action = "Edit";
        TypeName = "EditProfile";
    }
zwei Eigenschaften der Methode und Version:

Die Klasse von EditProfileParameters sollte einfach sein

[Export]
public class EditProfileParameters{
   public string Method { get; set; }
   public string Version { get; set; }
}

Der entscheidende Punkt ist der Export Attribut der Klasse hinzuzufügen. Dann sollten MEF Lage sein, diese Klasse auf den Parameter EditProfile des CTOR abzubilden.

Hier ist beispielsweise den Exportteil Container hinzuzufügen:

var container = new CompositionContainer(catalog);
var instance1 = new EditProfileParameters();
// set property values from config or other resources
container.ComposeExportedValue(instance1);
container.ComposeParts(this);

Obwohl spät, um das Spiel, hier ist ein weiterer Ansatz, der eine weniger bekannte Funktion von MEF nutzt: Immobilien Exporte

public class ObjectMother
{
    [Export]
    public static EditProfile DefaultEditProfile
    {
        get
        {
            var method = ConfigurationManager.AppSettings["method"];
            var version = ConfigurationManager.AppSettings["version"];

            return new EditProfile(method,version);
        }
    }
}

Keine Verwendungen sind für ObjectMother erforderlich für diese zu arbeiten, und es werden keine Attribute sind erforderlich, auf EditProfile.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top