Передать параметр в IServiceLocator

У меня есть класс ViewModel, который я хочу разрешить с помощью единства ServiceLocator, но мой viewModel требует параметра для конструктора. Тип параметра - это одна из сущностей в моем приложении (объект Customer), а не какая-то реализация сервиса. Я знаю, что при кодировании самого Unitycontainer я могу передать следующий параметр:

 _container.Resolve<CustomerDetailViewModel>(new ParameterOverrides {{"customer", customer}});

но если у меня нет прямого доступа к контейнеру, мне нужно пройти через ServiceLocator следующим образом:

(CustomerDetailViewModel)ServiceLocator.Current.GetInstance<CustomerDetailViewModel>();

Однако, используя второй подход, я не могу передать какие-либо параметры в ServiceLocator. Есть ли способ сделать это? "Неправильно" получить экземпляр контейнера из ServiceLocator и затем использовать его?

2 ответа

Решение

Проблема в том, что вы пытаетесь внедрить сущность (Customer в данном случае) в класс. Сущности являются недолговечными объектами, и они не являются хорошими кандидатами для введения.

Вместо того, чтобы вводить Customerзалить ICustomerRepository оказание услуг. Вы можете зарегистрировать ICustomerRepository реализация в пути запуска приложения, и таким образом вам не нужно будет вызывать контейнер напрямую, что упрощает разработку приложения и упрощает модульные тесты.

Если вы напишите обертку для ServiceLocator, вы можете поместить контейнер обобщения в обертку и предоставить дополнительную перегрузку метода разрешения, которая принимает свойство ParameterOverrides. Тогда метод мог бы использовать контейнер Unity для выполнения разрешения в соответствии с вашим первым фрагментом кода, а не фрагментом кода ServiceLocator.

Другие вопросы по тегам