如何正确使用深层对象图和许多依赖项进行手动 DI

2024-03-01

我相信这个问题已经以某种或其他方式被问到,但我还没有得到它。

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

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

AppPresenter->DashboardPresenter->GadgetPresenter->GadgetConfigPresenter

对象层次结构树中的 GadgetConfigPresenter 有一些依赖项,例如 CustomerRepository、ProjectRepository、MandatorRepository 等。

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

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

你这样写

创建 GadgetConfigPresenter[.] 的 GadgetPresenter

而不是直接创建GadgetConfigPresenter实例,GadgetPresenter should 依赖于抽象工厂 https://stackoverflow.com/questions/1890341/how-to-set-up-ioc-when-a-key-class-needs-session-or-other-context-specific-varia/1890463#1890463可以创造GadgetConfigPresenter它的实例。这推动了内部依赖GadgetConfigPresenter到工厂。

Using 构造函数注入一路走来,你的穷人的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);

注意我们如何打破依赖链通常,确保每个消费者的依赖项数量永远不会变得太大。

原则上,这意味着您必须在启动时创建所有依赖项,除非您实现延迟加载策略 http://blog.ploeh.dk/2010/01/20/RebuttalConstructorOverinjectionAntipattern.aspx.

诸如管理生命周期之类的事情正是 DI 容器可以提供极大帮助的事情,但是完全可以通过以下方式编写整个应用程序:遵循 DI 模式和原则 https://stackoverflow.com/questions/2045904/dependency-inject-di-friendly-library/2047657#2047657.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确使用深层对象图和许多依赖项进行手动 DI 的相关文章

随机推荐