Frage

Wie ich weiß, ob eine Variable Lazy deklariert wird, dann der Konstruktor aufgerufen wird, wenn wir die Value Eigenschaft verwenden.

Ich brauche einige Parameter dieses Lazy Beispiel passieren, aber die richtige Syntax nicht finden kann. Das ist nicht meine Absicht, ich bin mit MEF und ExportFactory, gibt sie mir Instanzen meiner Teile Lazy. Meine Teile haben Konstrukteure und ich brauche diese Konstrukteure mit einigen Parametern aufzurufen.

War es hilfreich?

Lösung

MEF hat bisher keine integrierte Möglichkeit für Sie Konstruktorparameter auf einen Teil zu übergeben, wenn Sie es mit einem ExportFactory erstellen. So etwas, was Wim Coenen schlägt vor, ist wahrscheinlich der beste Weg zu erreichen, was Sie wollen.

Andere Tipps

Sie können Ihre eigene Func exportieren statt:

public class FooFactory
{
    [Export(typeof(Func<string,int,ExportLifetimeContext<IFoo>>))]
    public ExportLifetimeContext<IFoo> CreateFoo(string param1, int param2)
    {
        Foo foo = new Foo(param1, param2);
        return new ExportLifetimeContext<IFoo>(foo,
            delegate
            {
                // Clean-up action code goes here. The client might not be able 
                // to do this through the IFoo interface because it might not
                // even expose a Dispose method.
                //
                // If you created other hidden dependencies in order to construct
                // Foo, you could also clean them up here. 
                foo.Dispose();
            });
    }
}

und Import es an anderer Stelle:

[Export(typeof(ISomething))]
public class FooUser : ISomething
{
    private readonly Func<string,int,ExportLifetimeContext<IFoo>> fooFactory;

    [ImportingConstructor]
    public FooUser(Func<string,int,ExportLifetimeContext<IFoo>> fooFactory)
    {
        this.fooFactory = fooFactory;
    }

    public void DoSomething()
    {
        using (var fooLifetime = this.fooFactory("hello", 3))
        {
            IFoo foo = fooLifetime.Value;
            ...
        }
    }
}

Wenn Sie nicht über die Reinigungsaktion benötigen, dann können Sie dies erheblich vereinfachen, indem alle die ExportLifetimeContext Sachen werfen.

Allerdings könnten einige Implementierungen von IFoo seinen Einweg (oder hängen von anderen Einweg-Objekten), während andere nicht. So wäre das richtigste, was zu tun ist, ein bauen Signal in die Abstraktion „Ich bin mit diesem Objekt gemacht“, das ist das, was ExportLifetimeContext bietet.

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