2014-08-30 4 views
2

종속성 해결 프로그램을 사용하고 있으며 동일하게 내 통합 컨테이너를 추가했습니다. 따라서 기본적으로 "GoldCustomer"는 현재 컨테이너 규칙에 따라 "CustomerController"에 주입됩니다.MVC 종속성 해결 프로그램 조건부

IUnityContainer oContainer = new UnityContainer(); 
oContainer.RegisterType<ICustomer, GoldCustomer>(); // injects GoldCustomer 
DependencyResolver.SetResolver(new UnityDependencyResolver(oContainer)); 

현재 컨테이너 구성으로 변경하려면 항상 새 컨테이너를 만들고 설정하고 SetResolver를 다시 호출 할 수 있습니다. 나는 위의 코드가 XML 설정을 통해 설정 가능해야하지만 여전히 픽스 할 새로운 컨테이너 객체가 필요하다면 여전히 setresolver를 호출해야한다는 것을 알고있다.

이 올바른 방법인가, 아니면 거기 응용 프로그램을 실행하는 동안 컨테이너 depedency 규칙을 변경하는 더 나은 방법.

두 번째 우리가 컨테이너를 변경할 수있는 이벤트는 session_start, httphandler 또는 그보다 나은 것입니다.

+0

나는이 그 답을 생각 HTTP : //stackoverflow.com/questions/15842827/is-it-possible-to-have-multiple-dependency-resolvers-in-asp-net-mvc-3 정적 객체이기 때문에 리졸버 변경은 좋은 생각이 아닙니다. . 서로 다른 조건을 사용하여 해결해야합니다. –

+0

유스 케이스를 이해하지 못했지만 대신 [컨테이너 계층 구조] (http://msdn.microsoft.com/en-us/library/dn507462.aspx)를 사용하고 싶습니까? 해석자를'UnityHierarchicalDependencyResolver'로 설정하고 하나의 루트 컨테이너 만 가질 수 있습니다. 그리고 나서이 해석기에 의해 자동으로 생성 된 하위 컨테이너가 즉석에서 채워질 수 있습니까? – TylerOhlsen

답변

0

첫째 이유는 여러 컨테이너를 필요? 응용 프로그램이 시작된 이후 등록 된 모든 종속성을 유지하는 싱글 톤 객체 여야합니다.

실습에서는 단일 컨테이너를 유지하고 필요한 경우 별도의 어셈블리에 여러 등록 함수를 만들고 AppBootstrapper에서이 함수를 모두 호출한다고 가정합니다.

응용 프로그램 인 경우 가장 좋은 방법은 비동기 동작이있는 응용 프로그램 시작을 사용하여 시작에 영향을주지 않는 것입니다.

============================================== ========

유감스럽게도 명명 된 등록 만이 유일한 옵션이며 이름을 명시 적으로 등록해야합니다. 그래서 내가 개인적으로 Autofac 및 SimpleInjector와 같은 DI 컨테이너를 좋아합니다. 그것들은 빠르며 여러 유형의 인터페이스를 여러 번 등록 할 수 있으며 해석자는 명시 적으로 이름을 요구하지 않고 유형 해석기 및 명명 된 해석자 메소드를 사용하며 해당 해석기도 무시할 수 있습니다.

+0

네, 우리가 싱글 톤으로 만들 수 있다는 것을 이해합니다.하지만 제 상황은 한 사용자에게 주어집니다. 그것은 한 세트의 객체가 주입 된 것이고 다른 사용자에게는 주입 된 다른 세트의 객체입니다. 다른 컨테이너로 depdency resolver를 계속 호출해야합니다. 이미 일부 싱글 톤 공장에서 온 것으로 가정합니다. DependencyResolver.SetResolver (새로운 UnityDependencyResolver (oContainer)); –

0

나는

내가 인터페이스 IMovieRepository과 EnglishMovieRepository 및 HindiMovieRepository을 구현하는 두 개의 클래스가 있다고 가정, 나는 다음과 같이 신속하게 내가 할 수있는 질문을 이해한다면 그것은 나에게 그 복잡한 보이지 않는 이유를 모르겠습니다.

방법은 다음과 같이 UnityConfig.cs에로를 해결하는 방법에 대한

If(condition) 
    { 
     container.RegisterType<IMovieRepository, EnglishMovieRepository>(); 
    } 
    else 
    { 
     container.RegisterType<IMovieRepository, HindiMovieRepository>(); 
    } 

요구 사항은 다음 날

감사를 알려 주시기 바랍니다 다른 무언가가있는 경우 /DJ

+0

응용 프로그램이 시작될 때 Asp.Net에서 등록이 이루어지기 때문에 이는 유효한 대답이 아닙니다. 조건은 고객 유형에 대한 질문에서 언급 한 바와 같이 런타임에 정의 된 내용에 따라 달라질 수 있습니다. 조건은 등록 유형이 아니라 해결 시간에 완료되어야합니다. –