Вы пишете, что
GadgetPresenter, который создает GadgetConfigPresenter [.]
Вместо непосредственного создания GadgetConfigPresenter
экземпляров, GadgetPresenter
должен взять зависимость от абстрактной фабрики , которая может создать для нее GadgetConfigPresenter
экземпляров. Это подталкивает внутренние зависимости GadgetConfigPresenter
к фабрике.
Используя Конструкторское внедрение полностью, ваша DI проводка для бедного человека должна выглядеть примерно так (извиняюсь за синтаксис C #):
var customerRepository = new CustomerRepository(/*...*/);
var projectRepository = new ProjectRepository(/*...*/);
var mandatorRepository = new MandatorRepository(/*...*/);
var gadgetConfigPresenterFactory =
new GadgetConfigPresenterFactory(
customerRepository,
projectRepository,
mandatorRepository);
var gadgetPresenter = new GadgetPresenter(gadgetConfigPresenterFactory);
var dashboardPresenter = new DashboardPresenter(gadgetPresenter);
var appPresenter = new AppPresenter(dashboardPresenter);
Обратите внимание, как мы часто разрываем цепочку зависимостей , гарантируя, что количество зависимостей для каждого потребителя никогда не станет слишком большим.
В принципе это означает, что вы должны создавать все зависимости во время загрузки, если вы не реализуете стратегию отложенной загрузки .
Такие вещи, как управление временем жизни, - это именно та вещь, в которой DI-контейнер может быть чрезвычайно полезен, но вполне возможно написать целое приложение, просто следуя шаблонам и принципам DI .
В целом, я все равно рекомендовал бы Контейнер DI, если это вообще возможно.