Инъекция вашего контейнера IoC? - PullRequest
6 голосов
/ 04 декабря 2011

Я искал все утро, пытаясь найти лучшие практики для доступа к вашему IoC.После добавления инжектора конструктора в ваши классы вам все еще нужно получить доступ к константе из классов, которые могут быть глубоко в вашем графе объектов приложений.В моем случае я делаю MVVM в WPF, и некоторые из моих моделей представления должны создавать другие модели представления, и они будут использовать контейнер для этого.Но вопрос в том, откуда им взять контейнер.Имеет ли смысл вводить и распространять?Можно ли сделать его инъекционным синглтоном?Является ли фабрика, которая обслуживает один сингл, более подходящей?

Какие есть варианты и компромиссы?

Обновление

Я нашел этот замечательный доклад МэттаHinze, который охватывает большую часть IoC: http://www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/04/08/inversion-of-control-in-action-by-matt-hinze-north.aspx

Похоже, один из ответов - использовать функцию сканирования и сохранять конфигурации IoC в реестрах в каждой сборке, а затем во время сканирования эти конфигурации реестра будут добавлены.

Есть ли другие подходы для рассмотрения?Особенно учитывая, что Мэтт продемонстрировал использование шаблона ServiceLocator, в то время как Марк Симан называет это анти-паттерном.Обратите внимание, что Мэтт предостерегал от использования шаблона и что определение Марка локатора службы (http://blog.ploeh.dk/Trackback.aspx?guid=5f05c086-295b-41e5-a50a-ed0cd77ac4bd) кажется отличным от того, что продемонстрировал Мэтт.

Ответы [ 2 ]

2 голосов
/ 04 декабря 2011

Вместо внедрения ваших реальных экземпляров ViewModel, что будет сложно, как вы говорите, вы можете внедрить фабрики в ваши лучшие ViewModel. Это похоже на шаблон поиска сервисов, предполагающий, что фабрики (или поставщики услуг, или что у вас есть) будут более конкретными в том, что они могут предоставить.

0 голосов
/ 04 декабря 2011

Один из способов - использовать ServiceLocator, указывающий на конкретный контейнер.Поскольку локатор обычно отображается как одиночный, вы получаете контейнер бесплатно из любого места в коде.

Например, в Unity это будет выглядеть как

// configure the locator somewhere early
UnityServiceLocator locator = new UnityServiceLocator( container );                 
ServiceLocator.SetLocatorProvider( () => locator );

...

// get the container anywhere
var container = ServiceLocator.Current.GetInstance<IUnityContainer>();

или нет локатор антипаттерна выходит за рамки.На мой взгляд - это не так, по крайней мере, не более «антипаттерн», чем весь IoC.

...