Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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 如何着手创建聚合_Domain Driven Design - Fatal编程技术网

Domain driven design 如何着手创建聚合

Domain driven design 如何着手创建聚合,domain-driven-design,Domain Driven Design,这一次我想问的问题是,构建聚合所需的抽象级别应该是什么 e、 g。 订单由OrderWorkflowHistory和Comments组成 我和 订单-订单工作流历史记录-工作流活动 订单-评论历史-评论 或 订单-工作流活动 订单-评论 其中OrderWorkflowHistory只是一个对象,它将封装发生的所有工作流活动。它维护一个列表。Order只是将维护活动列表的任务委托给这个对象 CommentHistory类似于用户附加的(列表)注释的包装器 当涉及到数据库时,最终订单被写入订单表,工

这一次我想问的问题是,构建聚合所需的抽象级别应该是什么

e、 g。 订单由OrderWorkflowHistory和Comments组成

我和
订单-订单工作流历史记录-工作流活动
订单-评论历史-评论

订单-工作流活动
订单-评论

其中OrderWorkflowHistory只是一个对象,它将封装发生的所有工作流活动。它维护一个列表。Order只是将维护活动列表的任务委托给这个对象

CommentHistory类似于用户附加的(列表)注释的包装器

当涉及到数据库时,最终订单被写入订单表,工作流活动列表被写入工作流活动表。OrderWorkflowHistory在持久性方面并不重要


从DDD的角度来看,哪一个是最佳的。请分享你的经验

正如您所描述的,容器(
OrderWorkflowHistory
CommentHistory
)似乎没有封装太多行为。在这个基础上,我会投票删除它们,直接按
顺序管理列表

一个警告。您可能会发现列表中要求的行为越来越多(例如复杂的搜索)。如果出现这种情况,引入一个/两个容器来封装该逻辑并停止
Order
变得臃肿可能是有意义的

我可能会从简单的解决方案(没有容器)开始,并且只在如上所述的情况下介绍它们。只要外部客户端通过
Order
的接口进行所有调用,您就可以在内部重构
Order
,而不会影响客户端


hth.

这是一个很好的问题,如何建模和丰富您的领域。但很难回答,因为不同的领域差异很大。 我的经验是,当我开始使用DDD时,我最终得到了很多存储库和一些值对象。我以开放的心态重读了一些书,并研究了几个DDD代码示例(有很多不同的方法可以实现DDD,但并非所有方法都适合您当前的项目场景)。 我开始试着记住“更多的价值对象,更多的价值对象,更多的价值对象”。为什么? 很好,值对象带来了更少的紧密依赖关系和更多的行为。 在您上面的一对多(1-n)关系示例中,我已经解决了1-n rel。根据我的用例,以不同的方式使用域

(1) 有时我会创建一个包装类(比如OrderWorkflowHistory),它是一个值对象。创建对象时,将设置子对象的整个列表。当您有一组必须在一个请求期间设置的子对象时,这种情况很好。例如,问卷表上的测验权重。然后,所有问题都应该通过一个方法Questionaire.ApplyTuning(QuestionaireTuning)来获得问题权重,其中QuestionaireTuning就像您的OrderWorkflowHistory,是列表的包装器。这将为域添加很多内容: a) 问卷永远不会处于无效状态。一旦我们应用了调整,我们就会针对问卷中的所有问题进行调整。 b) 问题调整可以提供良好的访问/搜索方法,以检索特定问题的权重或计算平均权重分数。。。等等

(2) 另一种方法是使1-n包装器类不是值对象。如果您想不时添加子对象,这种方法更适合。父对象不能处于无效状态,因为有x个子对象。这个典型的包装类有Add(Child…)方法和几个search/contains/exists/check方法

(3) 第三种方法是将IList公开为只读集合。您可以使用扩展方法(在.NET3.0中新增)添加一些搜索功能,但我认为这是一种设计风格。最好通过列表包装器类来封装提供的列表访问方法

请看方法1的一些示例

我相信,关于建模价值对象、实体以及谁负责DDD中最为中心的行为的整个讨论。请围绕这个话题分享你的想法