0

여러 웹 API 컨트롤러가 포함 된 ASP.NET 웹 API에서 작업하고 있습니다. 각 컨트롤러에는 IMessageSender에 대한 종속성이 있습니다. CloudMessageSender, InMemoryMessageSender 및 NServiceBusMessageSender - 컨트롤러를 생성하는 Unity에서 이름 등록을 해결합니다.

public class OrderController: ApiController { 
    private readonly IMessageSender _msgSender; 
    public OrderController(IMessageSender msgSender) { 
     _msgSender = msSender; 
    } 
} 

나는 IMessageSender의 3 가지 다른 구현이있다. 나는 의존성 해결을 위해 단결하고 Unity.WebApi을 사용하고 내가 직면하고 그 IMessageSender

container.RegisterType<IMessageSender, CloudMessageSender>("res-cloud"); 
container.RegisterType<IMessageSender, InMemoryMessageSender>("res-inmem"); 
container.RegisterType<IMessageSender, NServiceBusMessageSender>("res-nsvc"); 

문제의 3 개라는 이름의 등록을 등록

public class CloudMessageSender: IMessageSender 
{ 
} 
public class InMemoryMessageSender: IMessageSender 
{ 
} 
public class NServiceBusMessageSender: IMessageSender 
{ 
} 

다른 컨트롤러 나 다른를 사용할 필요가있다 IMessageSender의 구현. 전의. OrdersControllerCloudMessageSender을 사용해야하지만 CustomersControllerInMemoryMessageSender을 사용해야합니다. 기본적으로 Unity는 이름없는 해상도 나 (내 경우에는) 첫 번째 것을 삽입 할 것입니다.

IMessageSender의 구현과 함께 주입 할 컨트롤러를 어떻게 지정하거나 제어 할 수 있습니까?

+0

http://stackoverflow.com/questions/18665324/unity-register-for-one-interface-multiple-object-and-tell-unity-where-to-inject –

+0

이름 등록이 시작되면 [Pure DI] (http://blog.ploeh.dk/2014/06/10/pure-di/)로 전환하는 것이 더 좋습니다. 자세한 내용은이 기사를 참조하십시오. http://criticalsoftwareblog.com/index.php/2015/08/23/why-di-containers-fail-with-complex-object-graphs/ –

답변

1

컨트롤러를 주입기로 등록하도록 컨테이너를 구성 할 수 있습니다. 주입 멤버 목록에서 이미 등록 된 종속성을 이름으로 확인할 수 있습니다. 이렇게하면 컨트롤러 인스턴스가 생성 될 때 적절한 유형이 확인되도록해야합니다. OrderController 인스턴스가 초기화 될 때

container.RegisterType<IMessageSender, CloudMessageSender>("res-cloud"); 
container.RegisterType<IMessageSender, InMemoryMessageSender>("res-inmem"); 
container.RegisterType<IMessageSender, NServiceBusMessageSender>("res-nsvc"); 

var messageSender = new ResolvedParameter<IMessageService>("res-cloud"); 
container.RegisterType<OrderController>(new InjectionConstructor(messageSender)); 

은 이제 msgSender 인수의 유형은 CloudMessageSender에 해결 될 것입니다.

컨트롤러를 등록하는이 방법의 한 가지 문제점은 컨트롤러의 생성자 매개 변수를 모두 확인하고 전달해야한다는 것입니다.

Unity는이 접근법을 사용하지 않고 이름을 기반으로 유형을 해석하는 것을 지원하지 않습니다.

+0

"Unity는 유형 기반 분석을 지원하지 않습니다. 이름에이 방법을 사용하지 않고. " - 유니티를 사용하지 않는 좋은 이유입니다. 몇 년 안에 업데이트되지 않았다는 사실은 또 다른 문제입니다. – NightOwl888

+0

글쎄요 사용 여부는 케이스에 따라 다릅니다. MVC와 함께 장치를 사용하면 Castle Windsor와 같은 다른 장치와 비교하여 설치 및 구성이 간단 해집니다. 동의하면 Unity가 IoC 컨테이너와 일치하도록 업그레이드해야합니다. –