我正在开发一个 CMS 类型的应用程序,并希望使用一些 ddd 战术模式。情况如下:
该应用程序处理项目的创作和发布。
项目在工作流组中组合在一起。在该组中,一个项目可以标记为“已发布”,一个项目可以标记为“工作中”,任何数字都可以标记为“存档”。
只有处于“工作”状态的项目才能被编辑。
发布工作项目时,它会替换其相应的已发布项目(如果有),然后将其标记为已存档。
如果不存在草稿,则可以通过复制已发布版本或任何存档版本来创建新的工作版本。
问题是,按照聚合应该封装系统不变量的指导,工作流组是否应该是聚合根 - 包含它的所有项目?
我担心这会产生相当大的聚合,并且会阻止项目在全球范围内可访问(即所有交互都必须通过 Workflow Group AR)。
我看到的另一种方法是使 Item 成为 Aggregate Root,然后让域服务处理事务和不变量。例如:
PublishWorkingItem(int itemId)
{
Item workingItem = itemRepo.GetWorkingItem(itemId);
Guid groupId = workingItem.GroupId;
Item publishedItem = itemRepo.GetPublishedItemForGroup(groupId);
if(publishedItem != null)
{
publisheditem.Archive();
}
workingItem.Publish();
}