2013-12-11 2 views
0

이의 내가 모두 동일한 인터페이스를 구현하는 두 가지 구체적인 클래스가 있다고 가정하자 용기 :생성자 주입으로 해결 종속성 및 이름 매핑

var container = new UnityContainer(); 
container.RegisterType<IDataSource, DataSourceA>("A"); 
container.RegisterType<IDataSource, DataSourceB>("B"); 

내가 종속성 해결 때 맵핑 이름을 지정할 수 있다는 사실을 알고 :

var myDataSource = conatiner.Resolve<IDataSource>("A"); 

그러나 제 경우에는 의존성을 스스로 해결하지 않겠습니다. 나는 많은 다른 컨트롤러를 만들고 있는데, 나는 모든 컨트롤러를 만들기 위해 UnityDependencyResolver (ASP.Net MCVC에서)을 사용할 것이다. 일부 컨트롤러에는 DataSource A가 필요하고, 일부에는 DataSource B가 필요하고, 일부에는 두 가지가 모두 필요합니다. 내가하고 싶은 것은 다음과 같이 생성자 매개 변수에서 속성으로 사용할 매개 변수를 지정하는 것입니다.

public class ReportController{ 
    public ReportController([InjectionQualifier("A")] IDataSource dataSource) 
    { 
    ... 
    } 
} 

가능한가요? 나는 자바에서 봄의 세계에서 왔고이 스택에서 @Qualifier 어노테이션을 사용했다.

+1

. 여기를 참조하십시오. http://stackoverflow.com/questions/7046779/with-unity-how-do-i-inject-a-named-dependency-into-a-constructor – SouthShoreAK

답변

0

나는 개인적으로 직접 유니티 라이브러리에 의존하고 있기 때문에 종속성 속성을 사용하여 좋아하지 않는다. 생성자의 IUnityContainer를 전달할 수도 있습니다.

일반적으로 이름이 지정된 종속성을 사용해야하는 경우, 이는 일종의 전략 패턴을 구현하려고하기 때문입니다.

내가하는 일은 StrategyResolver라는 클래스에서 Unity를 격리하고 StrategyResolver를 종속성으로 주입한다는 것입니다. StrategyResolver가 나에게 속해 있기 때문에 내 "services"클래스는 StrategyResolver 내부를 제외하고 더 이상 Unity 라이브러리 객체에 대한 의존성을 더 이상 가지지 않지만 향후 새로운 전략을 추가 할 때 StrategyResolver를 다시 수정할 필요가 없기 때문에 받아 들일 수 있습니다.

나는 코드 예제와 함께이 대답에 내 접근 방식을 설명했습니다 살펴 보자 : 당신이 원하는 것이 정확히 가능하다 https://stackoverflow.com/a/37882179/483638