Passare parametri al costruttore, durante l'inizializzazione di un'istanza pigro
-
10-10-2019 - |
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.
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
.