繁体   English   中英

SPring 引导中多服务 bean 的设计模式

[英]Design pattern for Multiple services beans in SPring boot

我正在研究一个 spring 引导服务项目,我们有多个 Spring 服务 bean,它们相互自动连接。

例如:

@Service
public class Service1

@Autowire
Service2, Service3
.
.
.
@Service
public class Service5
@Autowire
Service 4, Service 1

@Repository
public interface Service1Repository extends JpaRepository<Entity1, UUID>
.
.
.
@Repository
public interface Service5Repository extends JpaRepository<Entity5, UUID>

大多数服务 bean 都自动连接到另一个服务 bean,同时将它们相应的存储库 bean 与其他一些 bean(ModelMapper,一些应用程序上下文 bean)自动连接在一起。有时这会导致循环依赖问题,有时它会在代码质量检查中失败通过构造函数注入自动装配了 9 个以上的 bean。

我的问题是,是否有最佳实践或设计模式来构建这些应用程序 spring bean?

我不能确切地说,因为我不知道这些服务到底在做什么。 但看起来您有许多作为服务公开的“事务脚本”,即您在每个服务中都有一个自上而下的程序类型的计算。 并且在某些时候,开发人员看到了服务中的重复,并决定在它们之间自动连接。

服务层基本上可以充当事务脚本,或者将域对象连接在一起并将它们公开给 controller 或其他层。 话虽如此,可以在其他服务中注入服务,但是它们太多了,正如您所说,循环依赖似乎是一个问题。

我最好的猜测是,该项目最初是一个事务脚本,但现在它发展成为需要域 model 的东西。 也许您应该尝试识别与业务逻辑相对应并且可以在不同服务之间重用的对象。 这应该会减少服务的数量。

这将是一个架构问题而不是设计问题。

如果不了解更多关于服务的性质,就不能说太多。

我的建议如下:

  • 如果可测试性不是您主要关心的问题(即强制执行类级不变量),请不要通过构造函数注入自动装配,尝试使用字段注入。 这有助于代码质量检查。
  • 尝试主要围绕模型对服务进行分组。 例如,对于 model Person,确实有一个 PersonRepository 和一个仅操作 Person 类型对象的 PersonService。 此外,仅从其相应的服务方法调用存储库方法。
  • 对于复杂的业务案例,有专门针对您正在解决的业务问题的服务类。 例如,如果您正在实施一个员工排班应用程序,则有一个用于生成名册的服务,另一个用于通知员工他们当前的日程安排,另一个用于将名册导出到 Google 表格。

您的问题没有详细说明这些服务的目的是什么。 如果您评估策略、工厂、构建器或复合设计模式是否对您的案例有帮助,那将是有益的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM