我正在开发一个CMS类型的应用程序,并希望使用一些ddd战术模式。情况是这样的:
该应用程序处理项目的创作和发布。
项目在工作流组中分组在一起。在该组中,一个项目可以标记为“已发布”,一个项目可以标记为“正在处理”,任何数量的项目都可以标记为“已存档”。
只有当项目处于“工作”状态时,才能对其进行编辑。
当工作项发布时,它将替换其相应的已发布项(如果有),然后将其标记为已存档。
如果不存在草稿,则可以通过复制已发布的版本或任何存档版本来创建新的工作版本。
问题是,遵循Aggregates应该封装系统不变量的指导,Workflow Group是否应该是一个包含其所有项的聚合根?
我担心的是,这将使一个相当大的聚合,它将阻止项目是全球可访问的(即所有交互将必须通过工作流组AR)。
我看到的替代方案是将Item设置为聚合根,然后使用域服务处理事务和不变量。例如:
PublishWorkingItem(int itemId)
{
Item workingItem = itemRepo.GetWorkingItem(itemId);
Guid groupId = workingItem.GroupId;
Item publishedItem = itemRepo.GetPublishedItemForGroup(groupId);
if(publishedItem != null)
{
publisheditem.Archive();
}
workingItem.Publish();
}发布于 2013-06-12 12:25:23
AR应该有自己的生命周期。这是您应该能够从您的领域专家那里获得的东西。
增强现实也是关于在高度内聚的对象图周围有锐利的边缘。
如果您发现在另一个AR中有一个AR,则需要删除包含的AR,并将其替换为仅包含的ID或值对象。
在您的情况下,活动项目和归档项目之间可能存在差异,因此归档项目不属于Workflow AR。但您可能最终会使Item成为AR,在这种情况下,您的Workflow AR可能包含活动项目in /VO的列表。
只有一些想法:)
发布于 2013-06-12 04:52:20
如果您还没有,我强烈建议您阅读vaughn vernon关于effective aggregate design的系列文章。第二部分建议您咨询您的领域专家,了解是否可以接受系统中存在陈旧数据。如果答案是肯定的,您可以考虑使用小型聚合(例如,域中的项目)来维护最终的一致性,而不是事务性的。例如,这可能意味着在一小段时间内,可能有两个项目处于已发布状态,但最终只有一个项目将被发布。您可以使用域事件来实现这种行为。拥有一个大的事务组成的聚合也是一种选择,但如果许多用户试图并发地操作同一组,则可能会导致高度的并发争用。
https://stackoverflow.com/questions/17052037
复制相似问题