首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >域驱动设计-用于事务一致性的聚合

域驱动设计-用于事务一致性的聚合
EN

Stack Overflow用户
提问于 2013-06-12 03:19:45
回答 2查看 481关注 0票数 1

我正在开发一个CMS类型的应用程序,并希望使用一些ddd战术模式。情况是这样的:

该应用程序处理项目的创作和发布。

项目在工作流组中分组在一起。在该组中,一个项目可以标记为“已发布”,一个项目可以标记为“正在处理”,任何数量的项目都可以标记为“已存档”。

只有当项目处于“工作”状态时,才能对其进行编辑。

当工作项发布时,它将替换其相应的已发布项(如果有),然后将其标记为已存档。

如果不存在草稿,则可以通过复制已发布的版本或任何存档版本来创建新的工作版本。

问题是,遵循Aggregates应该封装系统不变量的指导,Workflow Group是否应该是一个包含其所有项的聚合根?

我担心的是,这将使一个相当大的聚合,它将阻止项目是全球可访问的(即所有交互将必须通过工作流组AR)。

我看到的替代方案是将Item设置为聚合根,然后使用域服务处理事务和不变量。例如:

代码语言:javascript
复制
PublishWorkingItem(int itemId) 
{
    Item workingItem = itemRepo.GetWorkingItem(itemId);
    Guid groupId = workingItem.GroupId;
    Item publishedItem = itemRepo.GetPublishedItemForGroup(groupId);
    if(publishedItem != null) 
    {
        publisheditem.Archive();
    }
    workingItem.Publish();  
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-12 12:25:23

AR应该有自己的生命周期。这是您应该能够从您的领域专家那里获得的东西。

增强现实也是关于在高度内聚的对象图周围有锐利的边缘。

如果您发现在另一个AR中有一个AR,则需要删除包含的AR,并将其替换为仅包含的ID或值对象。

在您的情况下,活动项目和归档项目之间可能存在差异,因此归档项目不属于Workflow AR。但您可能最终会使Item成为AR,在这种情况下,您的Workflow AR可能包含活动项目in /VO的列表。

只有一些想法:)

票数 3
EN

Stack Overflow用户

发布于 2013-06-12 04:52:20

如果您还没有,我强烈建议您阅读vaughn vernon关于effective aggregate design的系列文章。第二部分建议您咨询您的领域专家,了解是否可以接受系统中存在陈旧数据。如果答案是肯定的,您可以考虑使用小型聚合(例如,域中的项目)来维护最终的一致性,而不是事务性的。例如,这可能意味着在一小段时间内,可能有两个项目处于已发布状态,但最终只有一个项目将被发布。您可以使用域事件来实现这种行为。拥有一个大的事务组成的聚合也是一种选择,但如果许多用户试图并发地操作同一组,则可能会导致高度的并发争用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17052037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档