你如何准确定义域名服务

时间:2014-11-29 20:15:58

标签: java domain-driven-design

  1. 有人可以给我一个很好的域名服务示例
  2. 他们应该是无国籍的。
  3. 它们等同于交易脚本。
  4. 可以将报告生成服务作为域服务进行调用。

1 个答案:

答案 0 :(得分:4)

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

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

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

识别的物体: 比勒 发票 电话 价目单价目表 PhoneCallRegistry

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

BillingService有 发票 电话 价目单价目表 PhoneCallRepository

正如您所看到的两个名字发生了变化。您现在可以看到域服务是执行某项任务的服务的人,在本例中是Biller。其次,PhoneCallRegister扮演集合的角色,它与DDD的存储库兼容,因此我们将其重命名为PhoneCallRepository。

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

2)域名服务是无国籍的,如果你考虑到我在前一点所说的话,你可以看到一个填写发票的人扮演一个比尔的角色,那家伙只是坐在他的办公桌上做他的工作参加许多“线程”。如果有其他人替换他我们不在乎,我们只是想打电话打开发票。

3)完全没有。事务脚本是进入遗留代码的过程代码。 biller / billingService是一个域对象。我认为你现在可以在阅读之前的观点之后自己理解它是否是交易脚本。

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

希望它有所帮助。

塞巴斯蒂安。