1

Я пытаюсь понять, где живет код для настройки моего контейнера инъекций зависимостей для моих служб репозитория доменов.Где я должен настроить свой контейнер DI для служб инфраструктуры домена в DDD?

Моя первоначальная мысль заключалась в том, чтобы клиент мог настроить все службы, но тогда клиент должен знать о службе репозитория, которую я не хочу раскрывать на клиенте.

Я думал, что каждый уровень может настраивать собственные зависимости службы через открытый метод настройки или класс?

+1

Я всегда создаю определенный слой со всей конфигурацией DI поверх слоя приложения. Благодаря этому мне не нужно повторять себя для всех пользовательских интерфейсов (отдыха, кли, мыла и т. Д.), Которые формируют конфигурацию DI. Это немного отличается, если вы используете гексагональную архитектуру, тогда она должна жить в пределах уровня инфраструктуры. – Dariss

+1

"репозиторий доменов * услуги *"? ... – guillaume31

+4

Обычно вы хотите настроить все свои DI в точке входа приложения. Http://blog.ploeh.dk/2011/07/28/CompositionRoot/ – guillaume31

ответ

4

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

То, что я, как правило, делаю это по-прежнему следовать шаблону Состава Root, где мой веб-проект будет первым место, где бы начать свой IoC проводка вверх (т.е. обычного рода 3-сторонней библиотеки, которая бы зацепить себя в фабрика контроллера). Но затем я настраиваю остальные привязки IoC, ссылаясь на модуль IoC (в моем случае я обычно использую Ninject, поэтому я ссылаюсь на NinjectModule из моего веб-проекта). Но я положил это NinjectModule в отдельный проект инфраструктуры.

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

Таким образом, мне не нужно создавать ссылки на проекты в моем веб-проекте на вещи, которые я, возможно, не хочу, чтобы мой веб-проект получал доступ, например, мой слой репозитория.

2

Ответ уже дан в комментариях, я просто завершу его в правильном ответе здесь.

Если вы не используете специальную архитектуру, такую ​​как плагин, , вы всегда должны настраивать контейнер DI в одном месте, как можно ближе к точке входа приложения. Это называется корнем композиции.

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

См. this blog post для хорошего ознакомления с деталями композиционных корней.

+0

Как это работает, когда мне нужно настроить зависимости, недоступные (скрытые модификаторами доступа) в корне композиции. – drizzie

+1

* * * * пряча это из корня композиции.Либо сделайте его доступным с помощью модификаторов доступа (предпочтительно), либо используйте такой механизм, как InternalsVisibleTo в .NET (я бы рекомендовал против этого, но его вариант). – theDmi

Смежные вопросы