【发布时间】:2021-01-08 14:37:02
【问题描述】:
我有这个经典的 DDD 问题;我有一个域服务“DetectPriority”可以做一些事情。
PM 让我创建 2 个不同的服务;一个 INTERNAL(包含完整的业务规则并涉及许多其他领域模型)和另一个 ETERNAL(一个简单的 API 调用)。
域中有一个接口“DetectPriorityInterface”。 两个实现必须同时处于活动状态;一种“混合”必须实时选择一个而不是另一个。
问题是:这些实现(两个实现)应该放在哪里:域层还是基础设施层??
内部实现充满了业务规则,应该驻留在领域层。 外部实现是一个简单的调用,应该存在于基础架构中。
我们应该把两者都放在基础设施层吗?
谢谢
编辑
实际上我们有一个接口“DetectPriority”和三个实现,都在我们的领域层(临时“错误”解决方案):
- InternalDetector(带有业务规则)
- ExternalDetector(使用外部 API 调用)
- MixerDetector(获取两个实现并处理选择)
客户端使用接口,所以对于应用层,所有这些东西都是透明的;接下来,我们将移除 Internal(或 External)和 Mixer 并仅使用一个实现。 (所有这些背后的想法是了解谁表现更好,这是一个 A/BN 测试)
我们的内部争论是:因为 InternalDetector 有一些仅属于该检测器的域规则,它应该存在于基础设施层,因为它不是通用域规则。我们中的一些人不同意这一点,因为在 InternalDetector 中我们只有业务规则,而在 Infra Layer 中看不到。
可能正确的方法应该是在Domain中添加Internal,在Infra中添加External ..但似乎有点混乱..
将所有内容放在 Infra 层中对开发人员来说更具可读性...
我们没有在书中找到一些东西,因为通常你只有一个域服务的实现......
【问题讨论】:
-
只是为了确保我正确理解了这个问题,在您的应用程序层中,您决定应该使用外部检测器还是内部检测器,对吧?如果是,您根据什么标准做出此决定?
-
这里最有趣的方面是您如何在两个检测器之间做出决定,以及该决定是否被视为业务逻辑或基础架构代码?代码应该将检测器视为由谓词选择的任意策略,还是内部和外部检测器之间的业务存在根本区别?例如。他们只是
Detectors 还是有BasicDetector和AdvancedDetector接口概念,例如,高级接口概念是由外部提供的。 -
@GFCoder977 如果是关于 A/B 测试,那么选择检测器是应用程序级别的决定。我已根据问题中的新信息更正了我的答案。
-
@GFCoder977 你说,“因为 InternalDetector 有一些域规则只属于那个 Detector,它应该存在于基础设施层,因为它不是通用域规则” .但是如果在 A/B 测试之后,你选择离开
InternalDetector这些规则将成为你的领域逻辑。