依赖注入导致 main 方法被新关键字填充

Dependency Injection leads to main method being filled with new keywords

我已经用构造函数完成了适当的依赖注入,但这使我的主要方法看起来像这样:

MyModel myModel = MyModelFileReader.getModel(Config.getDefaultFile());
MyApp myApp = new MyApp(myModel, new View(new SubView(myModel), new SubView(myModel, new CustomChart(Config.getChartOptionOne(), Config.getChartOptionTwo)));
myApp.start();

所有的建筑都堆在这里,看起来很糟糕。执行此操作的正确方法是什么?

您可以执行以下操作:

  1. 在单独的行上实例化每个对象。它将提高代码的可读性。
  2. 使用 "Builder" 创建型设计模式将对象构造从 main 方法提取到 "Builder" class 中,您可以在其中更好地管理它。 https://refactoring.guru/design-patterns/builder
  3. 使用一些 IoC container/Dependency 注入框架。来自 Spring 框架的核心模块包含一个很好的解决方案。您还拥有来自 Google 的 "guice" 框架以及更多。

要扩展@Nkosi 的评论,new 必须调用某处。对象是通过调用它们的构造函数来实例化的,依赖注入不会改变这一点。

如果你应用了一个DI框架,那个框架会承担实例化对象的责任,所以你不一定会看到new关键词;但它们只是被隐藏而不是被消除。

如果您应用自己的 DI,则您自己实现了一个 composition root(其中将填充 new 个关键字)。您的 main 方法正是实现合成根的正确位置。

请注意,组合根模式的优势在于它将对象实例化(以及 new 关键字)整合到一个位置。如果您考虑将对象创建为 "single responsibility",那么将该工作整合到 main 中会使您的代码库更具凝聚力。

没有模式可以消除 new 向上对象的需要。通过构造函数注入依赖项,您正在以正确的方式进行 DI。