Übergeben Parameter Konstruktor initialisiert, wenn eine Instanz lazy
-
10-10-2019 - |
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.
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.