/ / Cómo usar la Inyección de dependencias para crear ViewModels en una vista Master-Detail: prueba unitaria, mvvm, inyección de dependencia, tdd, inversión de control

Cómo utilizar la inyección de dependencia para crear ViewModels en una vista de detalle maestro: prueba de unidad, mvvm, inyección de dependencia, tdd, inversión de control

Estoy creando una aplicación Silverlight usando Jounce para mi MVVM. Tengo un CustomerListViewModel (plural) que tiene una colección de objetos CustomerViewModel (único).

Estoy usando Ninject para la inyección de dependencia, porque mis ViewModels dependerán de otras clases (es decir, repositorios, servicios, etc.).

Usar la inyección de dependencia es bastante fácil,pero ahora estoy un poco atascado. Cuando se carga CustomerListViewModel, irá a la base de datos (ya tiene su repositorio a través de DI) y obtendrá los objetos del Cliente. Estos deben pasarse a un CustomerViewModel.

¿Cómo haría para construir estos objetos CustomerViewModel? Siempre he leído que el patrón del Localizador de servicios es un antipatrón, por lo que esto se siente mal:

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

¿Cómo podría evitar este antipatrón? ¿O realmente no es tan malo?

Esto también hace que mi prueba de unidad sea un poco más difícil, porque puedo inyectar un ICustomerRepository falso en CustomerListViewModel (en el constructor), pero el ObjectFactory.GetInstance<CustomerViewModel>() funcionará como debería y también resolverá las dependencias subyacentes de CustomerViewModel. Esto fallará, porque no he configurado Ninject para estas dependencias subyacentes.

Respuestas

2 para la respuesta № 1

Aquí describí cómo lidié con tal escenario: http://pglazkov.blogspot.com/2011/04/mvvm-with-mef-viewmodelfactory.html. Se trata de MEF, pero la idea es la misma.

Básicamente puede tener un servicio separado llamado IViewModelFactory, con el que creará modelos de vista secundaria. Para las pruebas unitarias, podrá burlarse de ese servicio.