在领域驱动设计中,客户端直接与聚合根通信以实现业务逻辑,聚合根可以通过工厂创建或从存储库加载。为了实现业务逻辑,在某些情况下我们必须创建一个新的值对象,所以我的问题是: 聚合是否应该负责值对象的创建,也就是说将值对象的创建封装在聚合根中。 我能否在不使用聚合的情况下直接在应用程序服务中创建值对象?
我可以直接在应用程序服务中创建值对象而不使用聚合吗?当然可以。这是一个非常常见的模式 - 例如,在客户端/服务器架构中,客户端将向应用程序发送消息,邀请对域模型执行某些操作(命令/查询)。该消息将被设计为跨越进程边界 - 换句话说,它是数据传输对象。应用程序组件将接收该消息,并将其重新表达为值对象,该值对象将被领域理解。例如:域的查询可能会要求获取一些由UUID标识的帐户的详细信息。因此,初始DTO可能是一个字符串。应用程序层将该字符串抛入JSON解析器中,然后找到帐户ID参数(它只是数据),并使用它来创建一个AccountId值对象(域将识别该值对象)。值对象的一部分意义在于相等的对象可以自由地互换。没有人关心你有哪个7。“我们封装了聚合根中值对象的创建。”您的聚合代码也可能创建值对象。更改聚合的状态通常需要创建/计算新值。这没有任何问题。