Pasar parámetros a constructor, cuando se inicializa una instancia perezoso
-
10-10-2019 - |
Pregunta
Como puedo saber si se declara una variable Lazy
, a continuación, su constructor se llama cuando usamos la propiedad Value
.
Me necesita pasar algunos parámetros para esta instancia Lazy
pero no puede encontrar la sintaxis correcta.
Esta no es mi diseño, estoy usando MEF y ExportFactory
, devuelve mi Lazy
instancias de mis partes. Mis partes tienen constructores y tengo que llamar a estos constructores con algunos parámetros.
Solución
MEF no tiene una forma integrada para que usted pueda pasar parámetros de constructor a una parte cuando se crea con un ExportFactory. Algo parecido a lo que sugiere Wim Coenen es probablemente la mejor manera de lograr lo que desea.
Otros consejos
Se puede exportar su propia Func
lugar:
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();
});
}
}
e importación en otro lugar:
[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;
...
}
}
}
Si usted no necesita la acción de limpieza, entonces podría simplificar considerablemente esta lanzando a cabo todas las cosas de la ExportLifetimeContext
.
Sin embargo, algunas implementaciones de IFoo
pueden ser desechables (o dependen de otros objetos desechables), mientras que otros no lo son. Así que lo más correcto es construir una "Ya he terminado con este objeto" señal en la abstracción, que es lo que ofrece ExportLifetimeContext
.