/ / Comment utiliser Dependency Injection pour créer ViewModels dans une vue Master-Detail - test unitaire, mvvm, injection de dépendance, tdd, inversion de contrôle

Comment utiliser Dependency Injection pour créer ViewModels dans une vue Master-Detail - unit-testing, mvvm, injection de dépendance, tdd, inversion-of-control

Je suis en train de construire une application Silverlight en utilisant Jounce pour mon MVVM. J'ai un CustomerListViewModel (pluriel) qui possède une collection d’objets CustomerViewModel (single).

J'utilise Ninject pour l'injection de dépendance, car mes ViewModels seront dépendants d'autres classes (par exemple, les référentiels, les services, etc.).

L'utilisation de l'injection de dépendance est assez facile,mais maintenant, je suis un peu coincé. Lorsque CustomerListViewModel est chargé, il va dans la base de données (il a déjà son référentiel via DI) et récupère les objets Customer. Ceux-ci doivent être transmis à un CustomerViewModel.

Comment procéder pour construire ces objets CustomerViewModel? J'ai toujours lu que le motif Service Locator est un anti-motif, donc ça ne va pas:

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

Comment pourrais-je éviter cet anti-motif? Ou est-ce vraiment pas si grave?

Cela rend également mon unittesting un peu plus difficile, car je peux injecter un modèle ICustomerRepository dans le CustomerListViewModel (dans le constructeur), mais le ObjectFactory.GetInstance<CustomerViewModel>() fonctionnera comme il se doit et résoudra également les dépendances sous-jacentes de CustomerViewModel. Cela échouera alors, car je n’ai pas configuré Ninject pour ces dépendances sous-jacentes.

Réponses:

2 pour la réponse № 1

Ici, j'ai décrit comment j'ai géré ce scénario: http://pglazkov.blogspot.com/2011/04/mvvm-with-mef-viewmodelfactory.html. Il s'agit du MEF, mais l'idée est la même.

Fondamentalement, vous pouvez avoir un service séparé appelé IViewModelFactory, à l’aide duquel vous allez créer des modèles de vue enfant. Pour les tests unitaires, vous pourrez simuler ce service.