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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top