Ho le seguenti classi:come iniettare proprietà di dipendenza utilizzando Ioc Unità
public interface IServiceA
{
string MethodA1();
}
public interface IServiceB
{
string MethodB1();
}
public class ServiceA : IServiceA
{
public IServiceB serviceB;
public string MethodA1()
{
return "MethodA1() " +serviceB.MethodB1();
}
}
public class ServiceB : IServiceB
{
public string MethodB1()
{
return "MethodB1() ";
}
}
Io uso l'Unità per il CIO, la mia iscrizione si presenta così:
container.RegisterType<IServiceA, ServiceA>();
container.RegisterType<IServiceB, ServiceB>();
Quando ho risolvere un'istanza ServiceA
, serviceB
sarà null
. Come posso risolvere questo?
Se si dispone di una scelta tra il costruttore e l'iniezione di proprietà, penso che si dovrebbe scegliere l'iniezione del costruttore. L'iniezione di proprietà renderà la classe dipendente dall'unità o da qualche altro chiamante che "ricorda" di dover fornire tale dipendenza. L'iniezione del costruttore chiarisce a chiunque cerchi di usare la classe che la dipendenza è essenziale per la classe. – Carlos
E se la classe ha più dipendenze, non sono tutte necessarie in certe chiamate? Saranno tutti istanziati? Oppure verranno istanziati solo al momento dell'accesso, come sopra: serviceB.method()? @Carlos – Legends
@Legends tutte le dipendenze verranno installate e iniettate quando viene creato ServiceA anche se non le si utilizza in tutti i metodi. Unity non supporta l'istanziazione lazy out of the box ma può essere aggiunto come estensione: http://pwlodek.blogspot.hu/2010/05/lazy-and-ienumerable-support-comes-to.html – nemesv