2012-04-22 8 views
9

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?

risposta

14

di avere almeno due opzioni qui:

È possibile/dovrebbe utilizzare l'iniezione del costruttore, per questo è necessario un costruttore:

public class ServiceA : IServiceA 
{ 
    private IServiceB serviceB; 

    public ServiceA(IServiceB serviceB) 
    { 
     this.serviceB = serviceB; 
    } 

    public string MethodA1() 
    { 
     return "MethodA1() " +serviceB.MethodB1(); 
    } 
} 

o Unity supporta iniezione di proprietà, per questo è necessario un immobile e la DependencyAttribute:

public class ServiceA : IServiceA 
{ 
    [Dependency] 
    public IServiceB ServiceB { get; set; }; 

    public string MethodA1() 
    { 
     return "MethodA1() " +serviceB.MethodB1(); 
    } 
} 

MSDN sito What Does Unity Do? è un buon punto di partenza per l'Unità.

+6

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

+0

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

+1

@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