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?

È stato utile?

Soluzione

Nella mappa della struttura è possibile ottenere ciò utilizzando il metodo With:

string objectToLogFor = "PolicyName";
ObjectFactory.With<string>(objectToLogFor).GetInstance<ILogging>();

Vedi: http://codebetter.com/blogs/jeremy.miller/archive/2008/09/25/using-structuremap-2-5-to-inject-your-entity -Oggetti-in-services.aspx

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

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