Как использовать Dependency Injection для создания ViewModels в представлении Master-Detail - PullRequest
2 голосов
/ 25 августа 2011

Я создаю приложение Silverlight, используя Jounce для моего MVVM.У меня есть CustomerListViewModel (множественное число), в котором есть коллекция объектов CustomerViewModel (одиночная).

Я использую Ninject для внедрения зависимостей, потому что мои ViewModels будут зависеть от других классов (то есть репозиториев, служб и т. Д.).).

Использовать внедрение зависимостей довольно просто, но теперь я немного застрял.Когда 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);
    }

Как можно избежать этого анти-шаблона?Или это действительно не так уж плохо?

Это также усложняет мое тестирование юнитов, потому что я могу внедрить фиктивный ICustomerRepository в CustomerListViewModel (в конструкторе), но ObjectFactory.GetInstance<CustomerViewModel>() будет работать как надо, а также разрешать основные зависимости CustomerViewModel.В этом случае произойдет сбой, поскольку я не настроил Ninject для этих базовых зависимостей.

1 Ответ

2 голосов
/ 25 августа 2011

Здесь я описал, как я справился с таким сценарием: http://pglazkov.blogspot.com/2011/04/mvvm-with-mef-viewmodelfactory.html. Речь идет о MEF, но идея та же.

Как правило, у вас может быть отдельная служба с именем IViewModelFactory, с помощью которой вы будете создавать модели дочерних представлений. Для модульных тестов вы сможете издеваться над этим сервисом.

...