Come passare argomenti a un costruttore in un framework IOC
-
02-07-2019 - |
Domanda
Come posso passare argomenti a un costruttore in un framework IOC? Voglio fare qualcosa del tipo: (Cercando di essere agnostico in ambito IOC;))
object objectToLogFor = xxx;
container.Resolve<ILogging>(objectToLogFor);
public class MyLogging : ILogging
{
public MyLogging(object objectToLogFor){}
}
Sembra che ciò non sia possibile in StructureMap. Ma mi piacerebbe vedere qualcuno dimostrarmi che mi sbaglio.
Gli altri framework sono più ricchi di funzionalità? O sto usando il framework IOC nel modo sbagliato?
Soluzione
Nella mappa della struttura è possibile ottenere ciò utilizzando il metodo With:
string objectToLogFor = "PolicyName";
ObjectFactory.With<string>(objectToLogFor).GetInstance<ILogging>();
Altri suggerimenti
Per Castle Windsor:
var foo = "foo";
var service = this.container.Resolve<TContract>(new { constructorArg1 = foo });
nota l'uso di un oggetto anonimo per specificare gli argomenti del costruttore.
utilizzando StructureMap:
var foo = "foo";
var service = container.With(foo).GetInstance<TContract>();
Come può essere indipendente dalla lingua? Questo è il dettaglio di attuazione del framework in questione.
Spring ti consente di specificare c'tor args come un elenco di valori / riferimenti, se è la tua cosa. Non è molto leggibile, tuttavia, rispetto all'iniezione di proprietà.
Alcune persone si surriscaldano per questo, e insistono sul fatto che l'iniezione di c'tor sia l'unico approccio sicuro per i thread in Java. Tecnicamente sono corretti, ma in pratica tende a non avere importanza.
Non dovrebbe essere un'esigenza molto comune, ma a volte è valida. Ninject , che è più leggero di StructureMap, consente di passare parametri durante il recupero di oggetti transitori dal contesto. Spring.NET anche.
La maggior parte delle volte, gli oggetti dichiarati in un contenitore IoC non sono transitori e accettano altri oggetti non transitori attraverso costruttori / proprietà / metodi come dipendenze.
Tuttavia, se davvero non vuoi usare il contenitore come fabbrica e se hai abbastanza controllo sugli oggetti che vuoi risolvere, puoi usare l'iniezione di proprietà o metodo anche se suona meno naturale e più rischioso in in qualche modo.
Sì, altri framework sono più ricchi di funzionalità: è necessario utilizzare un framework ioc che consenta l'iniezione del costruttore. Spring è un esempio di contenitore di ioc multilingue che consente l'iniezione di dipendenza del costruttore.
Altri framework IoC sono più ricchi di funzionalità.
vale a dire. controlla il ParameterResolution con Autofac
Puoi farlo facilmente anche con Windsor