2012-04-22 4 views
9

를 사용하여 종속성 속성을 주입하는 나는 다음과 같은 클래스가 :어떻게 IOC의 단결

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

내가 IOC의를 위해 유니티를 사용, 내 등록은 다음과 같습니다

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

가 나는 ServiceA 인스턴스를 해결, serviceBnull입니다. 어떻게 해결할 수 있습니까? 여기

답변

14

당신은이 적어도 두 가지 옵션 :

당신은/생성자 주입을 사용해야합니다, 그것을 위해 당신은 생성자가 필요 할 수 있습니다

public class ServiceA : IServiceA 
{ 
    private IServiceB serviceB; 

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

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

또는 유니티는 당신이 프로퍼티를 필요로 재산 주입을 지원합니다 그리고 DependencyAttribute :

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

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

MSDN 사이트 What Does Unity Do? 유니티위한 좋은 출발점이 될 것입니다.

+6

생성자와 속성 삽입 사이에 선택 사항이 있다면 생성자 주입을 선택해야한다고 생각합니다. 속성 주입은 클래스가 하나 또는 다른 호출자가 그 의존성을 제공 할 필요가 있음을 기억한다는 것에 의존하게합니다. 생성자 삽입은 종속성이 클래스에 필수적이라는 것을 클래스를 사용하려는 모든 사람에게 명확하게 알려줍니다. – Carlos

+0

그리고 클래스에 종속성이 여러 개있는 경우 특정 호출에서 모두 필요하지는 않습니까? 그들은 모두 인스턴스화 될 것인가? 또는 위와 같이 액세스 할 때만 인스턴스화됩니다 : serviceB.method()? @Carlos – Legends

+1

@Legends 모든 의존성은 설치되고 모든 방법에서 ServiceA가 사용되지 않는 경우에도 주입됩니다. Unity는 상자에서 즉시 인스턴스화를 지원하지 않지만 확장으로 추가 할 수 있습니다. http://pwlodek.blogspot.hu/2010/05/lazy-and-ienumer-support-comes-to.html – nemesv

관련 문제