2012-04-22 12 views
9

Tengo las siguientes clases:cómo inyectar la propiedad de dependencia utilizando Ioc Unidad

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() "; 
    } 
} 

utilizo la Unidad para la COI, mi registro se ve así:

container.RegisterType<IServiceA, ServiceA>(); 
container.RegisterType<IServiceB, ServiceB>(); 

Cuando resuelvo un ejemplo ServiceA, serviceB será null. ¿Cómo puedo resolver esto?

Respuesta

14

usted tiene por lo menos dos opciones aquí:

Usted puede/debe usar la inyección de constructor, para eso se necesita un constructor:

public class ServiceA : IServiceA 
{ 
    private IServiceB serviceB; 

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

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

o la unidad es compatible con la inyección propiedad, para eso se necesita una propiedad y la DependencyAttribute:

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

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

el sitio de MSDN What Does Unity Do? es un buen punto de partida para la Unidad.

+6

Si tiene la opción entre el constructor y la propiedad de inyección, creo que debe elegir la inyección de constructor. La inyección de propiedad hará que la clase dependa de la unidad o de que otra persona "recuerde" que necesita proporcionar esa dependencia. La inyección de constructores deja en claro a cualquiera que intente usar la clase que la dependencia es esencial para la clase. – Carlos

+0

Y si la clase tiene múltiples dependencias, ¿no son todas necesarias en ciertas llamadas? ¿Serán todos instanciados? ¿O solo se crearán instancias cuando se acceda, como se indicó anteriormente: serviceB.method()? @Carlos – Legends

+1

@Legends Todas sus dependencias se instalarán e inyectarán cuando se cree el ServiceA incluso si no las usa en todos sus métodos. Unity no es compatible con la instanciación diferida de fábrica, pero se puede agregar como extensión: http://pwlodek.blogspot.hu/2010/05/lazy-and-ienumerable-support-comes-to.html – nemesv

Cuestiones relacionadas