2012-04-22 14 views
9

Mam następujących klas:Jak wstrzykiwać właściwość zależność używając MKOl Jedności

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

używam jedności IoC, moja rejestracja wygląda następująco:

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

Kiedy rozwiązać wystąpienie ServiceA, serviceB będzie null. Jak mogę rozwiązać ten problem?

Odpowiedz

14

mieć co najmniej dwie możliwości:

można/należy użyć konstruktora wtrysku, do tego trzeba konstruktora:

public class ServiceA : IServiceA 
{ 
    private IServiceB serviceB; 

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

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

lub Unity obsługuje zastrzyk własności, do tego trzeba właściwość a DependencyAttribute:

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

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

MSDN strona What Does Unity Do? jest dobrym punktem wyjścia do Jedności.

+6

Jeśli masz wybór między konstruktorem a iniekcją własności, myślę, że powinieneś wybrać wtrysk konstruktora. Zastrzyk własności sprawi, że klasa będzie zależna od jedności lub od jakiegoś innego "pamiętającego" rozmówcy, że musi dostarczyć tę zależność. Wstrzyknięcie Konstruktora czyni to oczywistym dla każdego, kto próbuje użyć klasy, że zależność jest istotna dla klasy. – Carlos

+0

A jeśli klasa ma wiele zależności, to nie wszystkie są potrzebne w niektórych połączeniach? Czy wszystkie zostaną utworzone? Czy będą one tworzone tylko podczas uzyskiwania dostępu, jak wyżej: serviceB.method()? @ Collos – Legends

+1

@Legends wszystkie twoje zależności zostaną wstawione i wstrzykną, gdy ServiceA zostanie utworzona, nawet jeśli nie użyjesz ich we wszystkich metodach. Unity nie obsługuje leniwych instancji po wyjęciu z pudełka, ale można je dodać jako rozszerzenie: http://pwlodek.blogspot.hu/2010/05/lazy-and-ienumerable-support-comes-to.html – nemesv

Powiązane problemy