使用委托来分隔层
Using delegation to separate layers
我们重构了一个 Java 应用程序,其中的代码到处都是,甚至没有遵循最基本的原则或模式。
我们设法提取了以下层:
- 一个数据层
- 一个存储库层,其中包含每种数据库实体的命令和查询存储库
- 一个服务层,它只与存储库一起工作,也可以有业务逻辑
- 一个服务编排层,它进行服务组合以实现应用程序的业务(不适用于存储库)
- 一个 API 和一个用于显示视图的控制器层,它应该只与编排服务一起工作
在多种情况下,控制器或 API 需要从服务(服务层)调用方法,但鉴于我们希望控制器仅与我们被迫创建的编排服务一起工作一个编排服务,除了将方法调用委托给实际服务外什么都不做。
这是一种正确的方法吗,还是我们应该删除中间人(编排),因为它除了委托什么都不做?
此致,
克里斯蒂安.
如果是我的代码,我宁愿遵循一个标准——即使编排层有时只是直接委托给服务层。在业务流程发生变化的情况下,这种变化有望被隔离到编排层,使调用代码不受变化的影响。此外,如果您试图围绕代码结构实施标准,请保持一致,以免不良做法再次开始蔓延。如果您有时直接调用服务层,而在其他时候通过编排层,这可能只会导致开发人员混淆何时使用哪种方法。
最后,检查您的操作的粒度 - 某些方法调用是否真正完全独立存在,或者它们是否构成更大业务流程的一部分?我同意您的分层方案 - 您的表示层应该知道如何调用业务流程(由编排层公开),但它应该不知道执行该流程所涉及的细节(由服务层公开)。即使业务流程只有一个步骤,它仍然是一个可以被编排层暴露的业务流程——它只是恰好是一个非常简单的流程。
我们重构了一个 Java 应用程序,其中的代码到处都是,甚至没有遵循最基本的原则或模式。 我们设法提取了以下层:
- 一个数据层
- 一个存储库层,其中包含每种数据库实体的命令和查询存储库
- 一个服务层,它只与存储库一起工作,也可以有业务逻辑
- 一个服务编排层,它进行服务组合以实现应用程序的业务(不适用于存储库)
- 一个 API 和一个用于显示视图的控制器层,它应该只与编排服务一起工作
在多种情况下,控制器或 API 需要从服务(服务层)调用方法,但鉴于我们希望控制器仅与我们被迫创建的编排服务一起工作一个编排服务,除了将方法调用委托给实际服务外什么都不做。
这是一种正确的方法吗,还是我们应该删除中间人(编排),因为它除了委托什么都不做?
此致, 克里斯蒂安.
如果是我的代码,我宁愿遵循一个标准——即使编排层有时只是直接委托给服务层。在业务流程发生变化的情况下,这种变化有望被隔离到编排层,使调用代码不受变化的影响。此外,如果您试图围绕代码结构实施标准,请保持一致,以免不良做法再次开始蔓延。如果您有时直接调用服务层,而在其他时候通过编排层,这可能只会导致开发人员混淆何时使用哪种方法。
最后,检查您的操作的粒度 - 某些方法调用是否真正完全独立存在,或者它们是否构成更大业务流程的一部分?我同意您的分层方案 - 您的表示层应该知道如何调用业务流程(由编排层公开),但它应该不知道执行该流程所涉及的细节(由服务层公开)。即使业务流程只有一个步骤,它仍然是一个可以被编排层暴露的业务流程——它只是恰好是一个非常简单的流程。