Domanda

Come faccio a sapere se è dichiarata una variabile Lazy, allora il suo costruttore viene chiamato quando usiamo la proprietà Value.

ho bisogno di passare alcuni parametri a questa istanza Lazy ma non riesce a trovare la sintassi corretta. Questo non è il mio disegno, sto usando MEF e ExportFactory, restituisce mi Lazy casi delle mie parti. Le mie parti hanno costruttori e ho bisogno di chiamare questi costruttori con alcuni parametri.

È stato utile?

Soluzione

MEF non ha un built-in modo per voi di passare parametri del costruttore ad una parte quando si crea con un ExportFactory. Qualcosa di simile a ciò che suggerisce Wim Coenen è probabilmente il modo migliore per ottenere ciò che si desidera.

Altri suggerimenti

Si potrebbe esportare il proprio Func invece:

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 l'importazione altrove:

[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;
            ...
        }
    }
}

Se non è necessario l'azione clean-up, allora si potrebbe semplificare notevolmente questo buttare fuori tutta roba la ExportLifetimeContext.

Tuttavia, alcune implementazioni di IFoo potrebbero essere monouso (o dipendono da altri oggetti monouso), mentre altri non lo sono. Così il più cosa giusta da fare è quello di costruire un "Ho chiuso con questo oggetto" segnale nel astrazione, che è quello che fornisce ExportLifetimeContext.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top