1

약간 혼란스러운 Unity를 사용하는 시나리오가 있습니다 ... 사용자를 인증하는 AuthenticationService가 있고 TextLogger 클래스 나 DbLogger 클래스를 사용하여 텍스트 파일이나 데이터베이스에 성공적으로 로그 할 때가 있습니다. 일반적으로 이는 이제까지 클래스 내 프로젝트 나는 아래로 내 모듈 클래스에 적절하게 등록 할에 사용됩니다Microsoft Unity, 두 가지 유사한 종속성을 해결 하시겠습니까?

public class LoggingModule 
{ 
    IUnityContainer _iocContainer; 

    public LoggingModule(IUnityContainer container) 
    { 
     _iocContainer = container; 
    } 

    public void Init() 
    { 
     //Add any logic here to look in a config file, check a property 
     //or any other condition to decide which implementation is registered. 

     //register the database logger to the ILogger interface 
     _iocContainer.RegisterType(typeof(ILogger), typeof(DBLogger)); 

    } 
} 

그리고 이것은 내 인증 서비스의 생성자에 주입됩니다. 그러나 응용 프로그램의 여러 지점에서 두 로거를 모두 사용하려면 먼저 Init 메서드에서 두 유형을 모두 등록해야합니다 (예 : TextLogger 및 DBLogger). 둘째, 내 컨테이너가 해결할 유형을 어떻게 알 수 있습니까?

도와주세요

....

+0

http://stackoverflow.com/questions/6109404/how-to-register-multiple-types-that-implement-the-same-interface – adt

답변

3

두 유형을 모두 이름 (예 :;

container.RegisterType<ILogger, DBLogger>("DBLogger"); 
container.RegisterType<ILogger, TextLogger>("TextLogger"); 

과 즉, 이름 매개 변수를 사용하여 유형을 해결;

var logger = container.Resolve<ILogger>("DBLogger"); 
+0

그것의 이름으로 상수 클래스를 만들 좋을 것이다 유형? 나는 정말 내 애플 리케이션에 걸쳐 문자열을 사용하는 것을 좋아하지 않는다. 그렇지 않으면, 고마워. – Donny

+0

명명 된 등록이 몇 개 필요한 경우 상수 클래스를 만들 수 있습니다. 그렇지 않으면 다른 컨테이너를 만들 수 있습니다. – daryal

0

당신이 자신을 중첩 된 컨테이너를 사용하고 Resolve 호출하지 않는 한은, 유니티는 응용 프로그램 전체 해상도가 아닌 시나리오 중심의 해상도를 제공합니다.

중첩 된 Unity 컨테이너를 사용하여 원하는 것을 얻을 수 있지만, 특히 중첩 된 컨테이너 접근 방식이 응용 프로그램 측면에서 '규칙에 대한 예외'에 더 많이 대처하기 때문에 자신의 코드에서 해결하는 것이 좋습니다. 전체 해상도.

각 인스턴스에 적합한 구체적인 유형을 결정하려면 코드 블록이 필요합니다. 그런 다음이 코드를 상위 수준의 제어/오케스트레이션 클래스로 밀어 넣어 적절한 구체 유형을 종속 인스턴스에 주입 할 수 있습니다.

관련 문제