Java 如何准确定义域服务 有人能给我举个域名服务的好例子吗 它们应该是无州的吗 它们是否等同于事务脚本 报表生成服务可以被称为域服务

Java 如何准确定义域服务 有人能给我举个域名服务的好例子吗 它们应该是无州的吗 它们是否等同于事务脚本 报表生成服务可以被称为域服务,java,domain-driven-design,Java,Domain Driven Design,域服务似乎是某种黑暗的、无状态的对象,DDD让我们编写它是为了让我们获得对聚合的引用。这听起来很技术,但实际上很简单,让我开始: 1) 域服务是一个域对象。这意味着它是分析中的域对象(有界上下文)。Bertrand Meyer曾经说过,“物体就在那里,你只需要识别它们”。与DDD混淆的是,每个试图理解每个术语的人都非常关注DDD名称,而忘记了域名。DDD正在执行OOP,唯一的区别是DDD修复了在域(有界上下文)中扮演给定角色的域对象的一些名称。让我告诉你: 用户故事:“为客户的电话生成发票” 确

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

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

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

确定的对象: 比勒 发票联 电话 价目表 电话注册

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

计费服务 发票联 电话 价目表 电话呼叫存储库

你看到两个名字变了。您现在可以看到,域服务是为完成某项任务而执行服务的人,在本例中是计费者。其次,PhoneCallRegister扮演集合的角色,它与DDD方面的存储库是一致的,因此我们将其重命名为PhoneCallRepository

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

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

3) 一点也不。事务脚本是进入遗留代码的过程代码。biller/billingService是一个域对象。在阅读了前面的几点之后,我想您现在已经自己理解了它是否是事务脚本

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

希望能有帮助


Sebastian.

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

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

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

确定的对象: 比勒 发票联 电话 价目表 电话注册

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

计费服务 发票联 电话 价目表 电话呼叫存储库

你看到两个名字变了。您现在可以看到,域服务是为完成某项任务而执行服务的人,在本例中是计费者。其次,PhoneCallRegister扮演集合的角色,它与DDD方面的存储库是一致的,因此我们将其重命名为PhoneCallRepository

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

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

3) 一点也不。事务脚本是进入遗留代码的过程代码。biller/billingService是一个域对象。在阅读了前面的几点之后,我想您现在已经自己理解了它是否是事务脚本

4) 根据第1点,答案是肯定的。但是,有时视图需要使用来自多个有界上下文的复杂交叉数据来表示,为此,您可能需要一个非规范化模型。在本例中,您将看到您的域中没有任何对象可以完成此任务,因此您可以直接从应用程序层(如rest服务)与存储库协作来执行查询并报告该查询