То, как вы описываете это, подразумевает, что уровень пользовательского интерфейса отвечает за создание контейнера DI.
Это может быть правдой в вашем конкретном приложении. Но помните, что часть инициализации является крошечной частью всего кода.
Да, есть НЕКОТОРЫЙ код, который создает контейнер DI и слой UI в определенном порядке. Может случиться так, что уровень пользовательского интерфейса вызывает функцию CreateDIContainer
, которая инициализирует все компоненты. Но эта единственная функция - единственный случай, когда упоминаются реализации; все другие аспекты уровня пользовательского интерфейса связаны с абстрактными интерфейсами. Пурист может быть проблемой, но на самом деле, в 99,5% кода, который НЕ CreateDIContainer
, пользовательский интерфейс не знает, что такое реализации. Переместите функцию инициализации в отдельный статический класс в отдельной библиотеке, если это делает вас счастливее.
<ч />
Я также заинтригован тем, что ты говоришь
Если бы я просто жестко запрограммировал зависимость ConcreteWidgetManager от ConcreteWidgetRepository ....,
То, что вы выдвинули это как вариант, заставляет меня задуматься: есть ли у вас какая-либо причина НЕ жестко кодировать эти отношения? Я использую внедрение зависимостей, когда мне нужно - конечное преимущество заключается в том, что я могу смоделировать части кода в моих автоматизированных тестах.
Вы собираетесь издеваться над ConcreteWidgetRepository
? Если это не так, тогда продолжайте и жестко закодируйте отношения. В противном случае вы просто вводите архитектуру ради архитектуры.
(См. Вам это не нужно .)