/ / Jak używać Dependency Injection do tworzenia ViewModels w widoku Master-Detail - testowanie jednostkowe, mvvm, wstrzykiwanie zależności, tdd, inwersja kontroli

Jak używać wtrysku zależności do tworzenia ViewModels w widoku szczegółów - testowanie jednostkowe, mvvm, wstrzykiwanie zależności, tdd, inwersja sterowania

Buduję aplikację Silverlight za pomocą Jounce dla mojego MVVM. Mam CustomerListViewModel (liczba mnoga), która ma kolekcję obiektów CustomerViewModel (pojedyncza).

Używam Ninject do wstrzykiwania zależności, ponieważ moje ViewModels będą zależały od innych klas (tj. Repozytoriów, usług itp.).

Korzystanie z wstrzykiwania zależności jest dość łatwe,ale teraz jestem trochę utknięty. Gdy CustomerListViewModel zostanie załadowany, przejdzie do bazy danych (ma już swoje repozytorium przez DI) i pobierze obiekty Customer. Te powinny zostać przekazane do CustomerViewModel.

Jak mam budować te obiekty CustomerViewModel? Zawsze czytałem, że wzorzec Lokalizatora usług jest anty-wzorcem, więc wydaje się to błędne:

    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);
}

Jak mogę uniknąć tego anty-wzoru? A może naprawdę nie jest tak źle?

To również sprawia, że ​​moje unittesting jest trochę trudniejsze, ponieważ mogę wstrzyknąć próbny ICustomerRepository do CustomerListViewModel (w konstruktorze), ale ObjectFactory.GetInstance<CustomerViewModel>() będzie działać tak, jak powinno, a także rozwiąże podstawowe zależności CustomerViewModel. To się wtedy nie powiedzie, ponieważ nie skonfigurowałem Ninject dla tych podstawowych zależności.

Odpowiedzi:

2 dla odpowiedzi № 1

Tutaj opisałem, jak sobie poradziłem z takim scenariuszem: http://pglazkov.blogspot.com/2011/04/mvvm-with-mef-viewmodelfactory.html. Chodzi o MEF, ale pomysł jest taki sam.

Zasadniczo możesz mieć oddzielną usługę o nazwie IViewModelFactory, za pomocą którego utworzysz modele widoku potomnego. W przypadku testów jednostkowych będziesz mógł wyśmiewać tę usługę.