2016-12-12 4 views
0

이전 고용주에서 Unity Unity를 처음 보았지만, Unity Unity를 처음으로 추가 할 때 Unity Unity가 효과적입니다. 결과적으로 나는 Unity v4.0.1을 사용하면서 천천히 테스트를하고 있습니다.Unity v4.0은 명시 적 등록없이 모든 종속성을 해결하는 것으로 보입니다.

간단한 종속성 그래프가있는 콘솔 응용 프로그램이 있습니다 : CommeesRepository에 종속되어있는 PayeeLogic에 종속 된 LoadPayees가 있습니다. 나는 하나의 방법은 매우 간단 유니티 등록 클래스를 만들었습니다

:

public class UnityRegistration 
{ 
    public static void RegisterCommissionsTypes(IUnityContainer container) 
    { 
     container.RegisterType<ILoadPayees, LoadPayees>(); 
    } 
} 

한 해상도 문 : 어셈블리 클래스 LoadPayees로 확인

var processorInstance = (BaseTaskProcessor) container.Resolve(Type.GetType(classWithAssembly)); 

.

내가 PayeeLogic에 대한 loadPayees의 방법 인젝터를 만든

:

[InjectionMethod] 
    public void Initialize(PayeeLogic payeeLogic) 
    { 
     this._payeeLogic = payeeLogic; 
    } 

및 CommissionsRepository에 대한 PayeeLogic의 생성자 인젝터 :

private CommissionsRepository _commissionsDal; 

    public PayeeLogic(CommissionsRepository commissionsDal) 
    { 
     this._commissionsDal = commissionsDal; 
    } 

이 난 다음에 그것을 기대 VS에서 디버깅을 만든 데 Unity와 함께 PayeeLogic 또는 CommissionsDAL을 명시 적으로 등록하지 않았으므로 null 참조 예외로 인해 파열됩니다. Unity를 사용하기 위해 수정하기 전에 전체 프로세스가 성공적으로 진행되었습니다.

그래서 바보 같거나 (가능성이 있습니다) 놓친 것일 수도 있고 Unity가 자동으로 LoadPayees의 모든 종속성을 자동으로 알아낼 수도 있습니다. 이는 예상 한 것과 다릅니다.

유니티 전문가들에게 내 질문은 이것들 중 어느 것입니까?

+2

유니티는 등록없이 클래스를 해결할 수 있습니다. –

+0

답변 해 주셔서 감사합니다. –

답변

0

대답은 예입니다. 최상위 개체가 등록되고 Unity로 해결되면 개체 종속성을 파악할 수 있으므로 개체 주입이 작동합니다. 그러나, 그래서. DI의 주요 포인트는 동일한 인터페이스를 구현하는 객체에 대한 구체적인 객체 인스턴스화를 스왑 할 수 있기 때문에 그렇게하고 싶다면 전체 객체 그래프를 등록하고 해결해야합니다.

public static void RegisterCommissionsTypes(IUnityContainer container) 
{ 
    container.RegisterType<ILoadPayees, LoadPayees>(); 
    container.RegisterType<IPayeeLogic, PayeeLogic>(); 
    container.RegisterType<IPayeeDataAccess, CommissionsRepository>(); 
    var payeeLogic = container.Resolve<PayeeLogic>(); 
    var payeeDal = container.Resolve<CommissionsRepository>(); 
} 

(불변 LoadPayee 해상도)

private IPayeeLogic _payeeLogic; 

방법 주입 :

[InjectionMethod] 
public void Initialize(IPayeeLogic payeeLogic) 
{ 
    this._payeeLogic = payeeLogic; 
} 

생성자 주입 :

private IPayeeDataAccess _commissionsDal; 

public PayeeLogic(IPayeeDataAccess commissionsDal) 
{ 
    this._commissionsDal = commissionsDal; 
} 
다음과 같이

는 내 코드를 변경 한

이것은 매우 초보자 질문이었습니다. 어쩌면 어리석은 질문 일 수도 있습니다. 그것은 Unity Unity가이 제품에 대해 머리를 맞히는 데 도움이되기를 바랍니다.