如何正确地使用深度对象图和许多依赖关系进行手动DI

Fab*_*ian 7 dependency-injection guice

我相信这些问题已经以某种方式或其他方式提出,但我还没有得到它.

我们做了一个GWT项目,我的项目负责人不允许使用GIN/Guice作为DI框架(新的程序员不会理解它,他认为)所以我尝试手动执行DI.

现在我遇到了深度对象图的问题.UI中的对象层次结构如下所示:

AppPresenter-> DashboardPresenter-> GadgetPresenter-> GadgetConfigPresenter

对象层次结构树中的GadgetConfigPresenter方式有一些依赖项,如CustomerRepository,ProjectRepository,MandatorRepository等.

因此,创建GadgetConfigPresenter的GadgetPresenter也具有这些依赖关系,依此类推,直到创建AppPresenter的应用程序的入口点.

  • 这是手动DI的工作方式吗?
  • 这是不是意味着我在启动时创建所有依赖项,即使我不需要它们?
  • 像GIN/Guice这样的DI框架会帮助我吗?

Mar*_*ann 10

你写的那个

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);
Run Code Online (Sandbox Code Playgroud)

请注意我们如何经常打破依赖关系链,确保每个使用者的依赖关系数量永远不会变得太大.

原则上,这意味着您必须在引导时创建所有依赖项,除非您实现延迟加载策略.

管理生命周期这样的事情正是DI容器非常有用的东西,但完全可以通过遵循DI模式和原则来编写整个应用程序.

总而言之,如果可能的话,我仍然会推荐一个DI容器.