Передать параметр в 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.