2011-01-17 4 views
6

두 컨테이너로 작업 할 때 Unity 컨테이너에서 이상한 동작이 발생합니다. 둘 다 동일한 장식 자에 등록됩니다. 코드 예제가 더 명확해질 것입니다. Unity : 두 인터페이스에 동일한 유형 등록

나는 다음과 같은 클래스 계층이 있습니다

public interface IBaseInterface 
    { 

    } 

    public interface IInterface1: IBaseInterface 
    { 

    } 
    public interface IInterface2: IBaseInterface 
    { 

    } 
    public class Interface1Impl : IInterface1 
    { 
    } 
    public class Interface2Impl : IInterface2 
    { 
    } 

    public class BaseInterfaceDecorator: IInterface1,IInterface2 
    { 
     private readonly IBaseInterface baseInterface; 

     public BaseInterfaceDecorator(IBaseInterface baseInterface) 
     { 
      this.baseInterface = baseInterface; 
     } 
    } 

    public class MyClass 
    { 
     private readonly IInterface1 interface1; 

     public MyClass(IInterface1 interface1) 
     { 
      this.interface1 = interface1; 
     }    
    } 

을 그리고 이것은 등록 코드 :

var container = new UnityContainer();   
     container.RegisterType<IInterface1, BaseInterfaceDecorator>(
      new InjectionConstructor(
       new ResolvedParameter<Interface1Impl>())); 

     container.RegisterType<IInterface2, BaseInterfaceDecorator>(
      new InjectionConstructor(
       new ResolvedParameter<Interface2Impl>())); 


     var dependency = container.Resolve<MyClass>(); 

내가 Interface2Impl 대신 Interface1Impl와 BaseInterfaceDecorator납니다 MyClass의 해결. 나에게 이상하게 보입니다. 설명 할 수 있니?

답변

9

주어진 "to"유형에 대한 마지막 주입 명령어와 비슷합니다. Reflector 사본을 가져 와서 UnityContainer.RegisterType (유형, 유형, 문자열, LifetimeManager, InjectionMember []) 구현을 살펴보면 그 이유를 알 수 있습니다.

IMO,이 동작은 버그입니다. 최소한 InjectedMembers.ConfigureInjectionFor (Type, string, InjectionMember [])는 이전 삽입 구성을 자동으로 바꾸는 대신 예외를 throw해야합니다. 그러나 실제로 시도하는 것을 지원해야합니다.

+0

; 내부적으로 Unity는 'to'유형의 빌드 키를 캐시합니다 (예 : 일반적인 서명에서 'TTo'). 다음에 'TFrom'유형을 확인하면 빌드를 수행하는 데 'TTo'의 빌드 키가 사용됩니다. 이 빌드 키는 평생 관리자와도 연관되어 있으므로 Unity는 TFTo의 ID와 상관없이 TTo에 대한 모든 하위 집합에 대해 처음 사용 된 수명 관리자 (Build Up)를 사용하는 것으로 나타납니다. 이것은 Unity의 빌드 키. 해결 방법은 이름이 같은 등록을 사용하는 것인데, 이는 공변 (covariant) 유형 신원 확인의 요점을 무효화합니다. –

2

도움이되는지 잘 모르겠습니다. 지금까지는 너무 늦은 것 같습니다. 그러나 이름이 지정된 등록을 사용하면 해결할 수 있습니다. 즉, 해결할 각 유형을 다른 이름으로 등록합니다. 예를 들어

:

이 독자에게 명확하지 않다 경우
Container.RegisterType<IInterface1, BaseInterfaceDecorator>("interface1"); 
Container.RegisterType<IInterface2, BaseInterfaceDecorator>("interface2"); 
+0

이것은 유효한 해결 방법이지만 등록시 공변 유형을 사용하는 목적을 무효화합니다. Unity는 'TTo'에 대한 모든 해석이 TTo 인스턴스를 생성하기위한 동일한 구성/지침을 참조한다고 가정합니다. 따라서, TFrom의 정체성이 다른 행동 (다른 주입 파마, 다른 평생 매니저 등)을 야기해야하는 주입 매개 변수 및 수명 관리와 관련된 문제점을 보게 될 것입니다. –

관련 문제