Где следует создавать контейнеры Unity и разрешать ссылки? - PullRequest
4 голосов
/ 07 июля 2011

Допустим, у меня есть хеш-компонент с контрактом на обслуживание, называемый IHash.У меня есть компонент DLL, который должен использовать хеширование.Мы используем Unity для создания слабосвязанной системы.

Должен ли я создать контейнер Unity и разрешить ссылку в самой DLL компонента?

Или я должен передать ссылку IHash в DLL компонентаcontructor, и пусть вызывающий компонент DLL взаимодействует с контейнером Unity и разрешает IHash.

public myComponentDLL(IHash Hasher) { }

Кажется, что если я создаю контейнер и разрешаю его в DLL компонента, Unity не слишком покупает меня.Я вижу большую выгоду в передаче его в конструкторе.

Есть ли лучший способ, кроме двух методов, описанных выше?Это хорошая практика?

Ответы [ 2 ]

4 голосов
/ 12 июля 2011

Единственное место в вашем приложении, где следует ссылаться на ваш контейнер IoC, - это корень приложения. Здесь вы регистрируете все свои компоненты и разрешаете корневой компонент программы. Затем Unity будет удовлетворять все зависимости, которые требуются корневому компоненту, а также зависимости всех этих компонентов и т. Д., Пока не будет построен весь граф зависимостей. См. http://devtrends.co.uk/blog/how-not-to-do-dependency-injection-the-static-or-singleton-container для получения дополнительной информации.

4 голосов
/ 07 июля 2011

Передача единицы компоненту не является хорошей практикой, вы не знаете его зависимостей, глядя на его конструктор, так как это займет всего IUnityContainer, и бог знает, сколько разрешений будет в конструкторе ,

Рекомендуется передавать интерфейс через конструктор (как вы это сделали), а также разрешать компонент в единстве, используя интерфейс компонентов. При разрешении вашего компонента единство выбирает IHash и внедряет его.

...