2

내 MVVM에 Jounce를 사용하여 Silverlight 응용 프로그램을 작성하고 있습니다. CustomerViewModel 객체 (단일)의 컬렉션이있는 CustomerListViewModel (복수형)이 있습니다.종속성 주입을 사용하여 마스터 - 세부보기에서 ViewModels을 만드는 방법

내 ViewModels가 다른 클래스 (예 : 리포지토리, 서비스 등)에 의존하기 때문에 의존성 삽입에 Ninject를 사용하고 있습니다.

의존성 주입을 사용하는 것은 매우 쉽지만, 지금은 조금 붙어 있습니다. CustomerListViewModel이로드되면 데이터베이스 (이미 DI를 통해 저장소가 있음)로 이동하여 Customer 객체를 가져옵니다. 이것들은 CustomerViewModel에 전달되어야합니다.

이러한 CustomerViewModel 객체를 어떻게 구성해야합니까? 나는 항상 Service Locator 패턴이 반 패턴이므로 다음과 같이 잘못 읽었습니다.

private void GetCustomerss() 
    { 
     var customers = _customerRepository.GetAll(); 
     IList<CustomerViewModel> customerViewModels = new List<CustomerViewModel>(); 
     foreach (var customer in customers) 
     { 
      var customerViewModel = ObjectFactory.GetInstance<CustomerViewModel>(); 
      customerViewModel.Model = customer; 
      customerViewModel.Add(customerViewModel); 
     } 
     Customers = new ObservableCollection<CustomerViewModel>(customerViewModels); 
    } 

이 안티 패턴을 어떻게 피할 수 있습니까? 아니면 그렇게 나쁘지 않은가?

(또한 constructor에서) CustomerListViewModel에 mock ICustomerRepository를 삽입 할 수 있기 때문에 단위 테스트가 조금 더 어려워 지지만 ObjectFactory.GetInstance<CustomerViewModel>()은 정상적으로 작동하며 CustomerViewModel의 기본 종속성도 해결됩니다. 이 기본 종속성에 대한 Ninject를 설정하지 않았으므로이 작업은 실패합니다.

답변

2

여기서 나는이 시나리오를 어떻게 처리했는지 설명했다 : http://pglazkov.blogspot.com/2011/04/mvvm-with-mef-viewmodelfactory.html. 그것은 MEF에 관한 것이지만 아이디어는 같습니다.

기본적으로 하위보기 모델을 만들 때 사용하는 IViewModelFactory이라는 별도 서비스를 사용할 수 있습니다. 단위 테스트의 경우 해당 서비스를 조롱 할 수 있습니다.

+0

ServiceLocator가 조롱 될 수있는 주입 된 종속성 인 한 동의합니다. 문제가 발생하지 않았습니다. 대부분의 DI 프레임 워크는 이미 컨테이너를위한 인터페이스이므로 쉽게 처리 할 수 ​​있습니다. – Agies

관련 문제