Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design DDD+;CQRS+;ES:实体或DTO可以是命令的一部分吗?_Domain Driven Design_Cqrs - Fatal编程技术网

Domain driven design DDD+;CQRS+;ES:实体或DTO可以是命令的一部分吗?

Domain driven design DDD+;CQRS+;ES:实体或DTO可以是命令的一部分吗?,domain-driven-design,cqrs,Domain Driven Design,Cqrs,在DDD、CQRS+EventSourcing应用程序的命令中包含实体或dto可以吗?我认为不应该这样做,至少没有实体应该是命令的一部分 我试着用语言来描述这个问题: 我有一个聚合根A,它可以有一个属性实体列表。属性实体没有自己的聚合根,它只是我的聚合根A的一部分。此外,同一个属性实体不能是另一个聚合根的一部分 我公司的一些开发人员认为,使用CreateAggregateA命令保存属性实体对象列表是一种不错的方法。命令处理程序创建聚合,将所有属性实体添加到列表并保存聚合 此外,Aggregate

在DDD、CQRS+EventSourcing应用程序的命令中包含实体或dto可以吗?我认为不应该这样做,至少没有实体应该是命令的一部分

我试着用语言来描述这个问题: 我有一个聚合根A,它可以有一个属性实体列表。属性实体没有自己的聚合根,它只是我的聚合根A的一部分。此外,同一个属性实体不能是另一个聚合根的一部分

我公司的一些开发人员认为,使用
CreateAggregateA
命令保存
属性实体
对象列表是一种不错的方法。命令处理程序创建聚合,将所有属性实体添加到列表并保存聚合

此外,
AggregateACreated
事件还包含属性实体列表,这也是不正确的

是否可以将属性实体与位于域中的
propertyDto
对象交换(命令和处理程序位于域中)

或者命令应该总是尽可能简单。 例如,要使用一个只包含简单类型(字符串名称、字符串其他参数)的
CreateAggregateA
命令,我们需要一个额外的命令
CreateProperty
,该命令创建属性实体并将其添加到链接的聚合中

有什么最佳实践吗?我在谷歌上搜索了很多,但没有找到明确的声明或指导

非常感谢您的任何帮助和意见

问候,,
Christian

免责声明:我不是DDD专家。我只是分享我对它的了解和一些个人观点


在DDD中:

  • 实体在其整个生命周期中应具有唯一标识
  • 它也可能有一些不变量在其所有生命周期中保持有效和一致的状态
  • 我看到的大多数DDD示例都是在类似六边形的体系结构中实现的,其中命令直接在主适配器(例如HTTP控制器)中实例化和分解,然后传递到应用程序服务或命令总线

    也就是说,在命令中包含实体可能会引导您在执行请求和/或逻辑验证之前,首先使用外部数据改变它们的状态。因此,在某些情况下,2/不能得到尊重

    此外,这样做可能会迫使您在外部数据中提供所有实体的属性,这并非总是必需的

    DDD将值对象视为域模型的第一类公民,并建议使用它们(如果它们对您的模型有意义):

  • 它们与实体没有相同的约束。因此,它们也可以用于命令、事件和实体中
  • 它们还可以帮助您重构代码,并使其他对象保持小而简单
  • 在DDD+CQR中,实体特别处理写关注点,而VO可以用作读模型

    结论:

    在项目中实现DDD可能会使您在设计中花费更多的时间,编写具有不同关注点的许多对象,产生一些冗余代码,等等。 这可以帮助您处理业务复杂性,并使您的模型清晰可控:)

    如果您的业务简单、不涉及大量风险或不属于核心业务领域,那么基于CRUD的解决方案(它尊重DRY并使用实体来处理不同的问题)也可能是有效的


    我希望这会有所帮助。免责声明:我不是DDD专家。我只是分享我对它的了解和一些个人观点


    在DDD中:

  • 实体在其整个生命周期中应具有唯一标识
  • 它也可能有一些不变量在其所有生命周期中保持有效和一致的状态
  • 我看到的大多数DDD示例都是在类似六边形的体系结构中实现的,其中命令直接在主适配器(例如HTTP控制器)中实例化和分解,然后传递到应用程序服务或命令总线

    也就是说,在命令中包含实体可能会引导您在执行请求和/或逻辑验证之前,首先使用外部数据改变它们的状态。因此,在某些情况下,2/不能得到尊重

    此外,这样做可能会迫使您在外部数据中提供所有实体的属性,这并非总是必需的

    DDD将值对象视为域模型的第一类公民,并建议使用它们(如果它们对您的模型有意义):

  • 它们与实体没有相同的约束。因此,它们也可以用于命令、事件和实体中
  • 它们还可以帮助您重构代码,并使其他对象保持小而简单
  • 在DDD+CQR中,实体特别处理写关注点,而VO可以用作读模型

    结论:

    在项目中实现DDD可能会使您在设计中花费更多的时间,编写具有不同关注点的许多对象,产生一些冗余代码,等等。 这可以帮助您处理业务复杂性,并使您的模型清晰可控:)

    如果您的业务简单、不涉及大量风险或不属于核心业务领域,那么基于CRUD的解决方案(它尊重DRY并使用实体来处理不同的问题)也可能是有效的


    我希望这会有所帮助

    DTO、命令/查询及其处理程序属于应用程序层,而事件属于域层。我非常不同意命令处理程序属于应用程序层。它们是域的一部分。否则,可以在命令处理程序的读取端进行查找,这在DDD CQR中是不允许的。这里有解释:但我想我找到了答案。实体不应是命令的一部分,也绝对不应是事件的一部分。通常,该命令是在控制器中根据发送的某些数据创建的