Можно ли вводить контейнер на завод? - PullRequest
2 голосов
/ 01 февраля 2012

Я использую фабрику для создания различных конкретных экземпляров интерфейса.Один из конкретных примеров зависит от службы, которая обычно вводится.Жизненный цикл сервиса управляется контейнером.В этом случае нормально ли вводить контейнер на завод?

Ответы [ 2 ]

2 голосов
/ 02 февраля 2012

В этом случае нормально ли вводить контейнер на завод?

Конечно. Но только , если эта фабричная реализация находится внутри Composition Root . Если эта фабрика находится в самом приложении (другими словами, вне корня композиции), вы используете контейнер в качестве локатора службы, который является анти-шаблоном и следует избегать.

2 голосов
/ 01 февраля 2012

Я бы позволил контейнеру разрешить абстрактную фабрику, интерфейс фабрики или делегат фабрики и вместо этого внедрить это в потребителей.

Затем фабрика может принять службу как зависимость, которую фабрика разрешит.

Обновление на основе комментариев:

Если вы внедряете сервис на заводе, один и тот же экземпляр этого сервиса не будет передан каждому объектуфабрика создает?

Да, каждый объект, созданный фабрикой, получит один и тот же экземпляр службы (что обычно и требуется).Если это не , что вы хотите, введите фабрику обслуживания на заводе.Некоторые контейнеры предлагают поддержку автоматического разрешения фабричных делегатов, поэтому вы можете ввести Func<IFooService>.

Но тогда жизненный цикл службы привязан к жизненному циклу фабрики

Как отметил @SebastianWeber в комментариях, это не ограничение всех контейнеров.Кроме того, подумайте, имеет ли это значение.Вы можете выбрать самый короткий из двух периодов жизни и использовать его для обоих.

...