依赖注入导致 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();
所有的建筑都堆在这里,看起来很糟糕。执行此操作的正确方法是什么?
您可以执行以下操作:
- 在单独的行上实例化每个对象。它将提高代码的可读性。
- 使用 "Builder" 创建型设计模式将对象构造从 main 方法提取到 "Builder" class 中,您可以在其中更好地管理它。 https://refactoring.guru/design-patterns/builder
- 使用一些 IoC container/Dependency 注入框架。来自 Spring 框架的核心模块包含一个很好的解决方案。您还拥有来自 Google 的 "guice" 框架以及更多。
要扩展@Nkosi 的评论,new
必须调用某处。对象是通过调用它们的构造函数来实例化的,依赖注入不会改变这一点。
如果你应用了一个DI框架,那个框架会承担实例化对象的责任,所以你不一定会看到new
关键词;但它们只是被隐藏而不是被消除。
如果您应用自己的 DI,则您自己实现了一个 composition root(其中将填充 new
个关键字)。您的 main
方法正是实现合成根的正确位置。
请注意,组合根模式的优势在于它将对象实例化(以及 new
关键字)整合到一个位置。如果您考虑将对象创建为 "single responsibility",那么将该工作整合到 main
中会使您的代码库更具凝聚力。
没有模式可以消除 new
向上对象的需要。通过构造函数注入依赖项,您正在以正确的方式进行 DI。
我已经用构造函数完成了适当的依赖注入,但这使我的主要方法看起来像这样:
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();
所有的建筑都堆在这里,看起来很糟糕。执行此操作的正确方法是什么?
您可以执行以下操作:
- 在单独的行上实例化每个对象。它将提高代码的可读性。
- 使用 "Builder" 创建型设计模式将对象构造从 main 方法提取到 "Builder" class 中,您可以在其中更好地管理它。 https://refactoring.guru/design-patterns/builder
- 使用一些 IoC container/Dependency 注入框架。来自 Spring 框架的核心模块包含一个很好的解决方案。您还拥有来自 Google 的 "guice" 框架以及更多。
要扩展@Nkosi 的评论,new
必须调用某处。对象是通过调用它们的构造函数来实例化的,依赖注入不会改变这一点。
如果你应用了一个DI框架,那个框架会承担实例化对象的责任,所以你不一定会看到new
关键词;但它们只是被隐藏而不是被消除。
如果您应用自己的 DI,则您自己实现了一个 composition root(其中将填充 new
个关键字)。您的 main
方法正是实现合成根的正确位置。
请注意,组合根模式的优势在于它将对象实例化(以及 new
关键字)整合到一个位置。如果您考虑将对象创建为 "single responsibility",那么将该工作整合到 main
中会使您的代码库更具凝聚力。
没有模式可以消除 new
向上对象的需要。通过构造函数注入依赖项,您正在以正确的方式进行 DI。