передать параметр в IServiceLocator - PullRequest
4 голосов
/ 15 марта 2011

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 15 марта 2011

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

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

0 голосов
/ 18 мая 2011

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

...