2014-07-27 2 views
3

현재 Mvvm Light의 IoC 컨테이너에 문제가 있습니다. 인터페이스가 IDataService인데, 이는 두 클래스 (DataService1DataService2)로 구현됩니다. 또한 많은 종속성을 가진 MainViewModel 클래스가 있는데 하나는 IDataService입니다.MVVMLight의 IoC 컨테이너 - 구체적인 구현을 지정된 요소로 전달하는 방법은 무엇입니까?

요점은 MainViewModelDataService2을 입력하고 싶습니다. 어떻게해야합니까? 나는 "키"그 같은 IDataServiceMainViewModel의 두 경우에 시도했다 :

class MainViewModel 
{ 
    // MainViewModel has many dependencies, 
    public MainViewModel(X x, Y y, Z z, M m, N n, IDataService dataService) { } 
} 

(...) 

SimpleIoc.Default.Register<IDataService>(() => new DataService1(), "A"); 
SimpleIoc.Default.Register<IDataService>(() => new DataService2(), "B"); 


(...) 

var viewModel = SimpleIoc.Default.GetInstance<MainViewModel>("B"); // Runtime exception 

그러나 나는 기본적으로 MainViewModel가 해결 될 수 없다는 런타임 예외를 얻을 - 내가 이해 한 것과을 나는 경우 MainViewModel ("B")으로 수정하려는 경우 모든 종속성을 키 설정해야합니다. 이것은 내가 원하는 것이 아니며, 하나만 제외하고는 디폴트 종속성이있는 MainViewModel을 해결하려고합니다.

어떻게하면됩니까? 나는 분명히 뭔가를 놓치고있다. 모든 도움을 미리 감사드립니다.

+0

정확한 예외 메시지는 무엇입니까? – romanoza

+0

http://stackoverflow.com/questions/19301891/mvvmlight-simpleioc-and-multiple-concrete-implementations –

+0

@RomanKo ActivationException이 발생합니다. 추가 정보 : 키가없는 캐시에 유형이 없습니다. ViewModels.MainViewModel – Malutek

답변

2

싫은 말이지 만, 유일한 방법처럼 보입니다. 열쇠가있는 공장을 등록해야합니다.

SimpleIoc.Default.Register<MainViewModel>(() => new MainViewModel(new X(), new Y(), new Z(), new M(), new N(), SimpleIoc.Default.GetInstance<IDataService>("B")), "B"); 
+0

예, 동일한 결론에 도달했습니다. 그러나 IoC-Container를 사용하는 목적을 실질적으로 무효로합니다. X, Y, Z 클래스는 자체 의존성을 가지고 있기 때문에 제공해야합니다. 의견을 보내 주셔서 감사합니다. 나는 조금 더 기다릴 것이고 아무도 대답하지 않으면 당신의 대답을 받아 들일 것입니다. – Malutek

+0

@MuteTek : 네. 따라서 이름 : ** 단순 ** Ioc. – romanoza

+0

@romanoza 더 우아한 방법으로 할 수있는 IOC를 아십니까? – Sam

관련 문제