gpt4 book ai didi

java - 如何准确定义域服务

转载 作者:行者123 更新时间:2023-12-01 18:22:42 24 4
gpt4 key购买 nike

  1. 有人可以给我一个域服务的好例子吗
  2. 它们应该是无状态的吗?
  3. 它们相当于交易脚本吗?
  4. 报告生成服务可以作为域服务调用吗?

最佳答案

领域服务似乎是某种黑暗的、无状态的对象,DDD 让我们编写它,因为为了让我们获得对聚合的引用。这一切听起来非常技术性,但实际上非常简单,让我开始:

1) 域服务是域对象。这意味着它是您的分析领域的对象(有界上下文)。伯特兰·迈耶曾经说过,“物体就在那里,你只需识别它们”。 DDD 的困惑在于,每个试图理解每个术语的人都非常关注 DDD 名称,而忘记了域。 DDD 正在执行 OOP,唯一的区别是 DDD 修复了在域(有界上下文)中扮演给定角色的 DOMAIN 对象的一些名称。让我告诉你:

用户故事:“为客户的电话生成发票”。

已识别的对象:比勒发票电话价位表PhoneCallRegistry

如您所见,这些是为用户故事标识的域对象以及我们可用于编写代码的名称。然而,如果我们使用 DDD,我们必须重命名其中一些对象,让我们看看它是如何实现的:

计费服务发票电话价位表电话调用存储库

如您所见,两个名字发生了变化。您现在可以看到,域服务是执行服务以完成某些任务的人,在本例中是记账者。其次,PhoneCallRegister 扮演着集合的角色,在 DDD 方面它符合存储库的含义,因此我们将其重命名为 PhoneCallRepository。

DDD 不是一个新事物,它只是在做 OOP,但它让我们重命名我们域的一些对象,但是你可以使用 Biller 或 PhoneCallRegistry 并且你仍然在做 DDD。这就是为什么 DDD 很难理解的原因。

2)域服务是无状态的,如果你考虑到我在上一点中所说的,你可以看到一个填写发票的人扮演着记账人的角色,这个人只是坐在办公 table 前做他的事情参与服务许多“线程”的工作。如果有其他人取代他,我们不在乎,我们只想给电话开具发票。

3)一点也不。事务脚本是进入遗留代码的过程代码。 biller/billingService 是一个域对象。我想看完前面的几点你现在已经明白它是否是事务脚本了。

4) 根据第一点,答案是肯定的。然而,有时需要向 View 提供来自多个有界上下文的复杂交叉数据,并且您可能有一个用于此目的的非规范化模型。在这种情况下,您将看到域中没有对象可以完成此任务,因此您可以直接从应用程序层(如休息服务)与存储库协作来执行查询并将其报告给 View 。您可以将此对象称为“ReportingService”。

希望有帮助。

塞巴斯蒂安。

关于java - 如何准确定义域服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27206646/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com