我目前正在尝试在 DDD 中编写一个应用程序,允许创建、更新和删除实体。对实体的更改必须得到另一个人的批准。应用程序还必须跟踪对实体所做的更改。简化的域模型如下所示:
应用程序具有含有一个界上下文ChangeSet
,Enity
以及EntityHistory
其中ChangeSet
是聚合根。我以这种方式设计了聚合,因为在Entity
没有 a 的情况下不应该更改 a ChangeSet
,而且 aChangeSet
应该与编辑的实体一起保存在一个事务中。出于这个原因,我设计了一个单一的聚合。
创建新实体时,设计效果很好:
private void CreateChangeSet()
{
var repository = new ChangeSetRepository();
var entities = new List<Entity>
{
new Entity(Guid.NewGuid(), "Test1", new TagStatus(1, EntityState.Pending));
};
var changeSet = new ChangeSet("a user", "Added a new entity", DateTime.Now, ApprovalState.Submitted, entities);
repository.Insert(changeSet);
}
但是,当我尝试编辑实体时,我的设计中出现了问题:
private void EditEnity()
{
var repository = new ChangeSetRepository();
var entity = repository.GetEntityByName("Test1");
entity.AssignName("a new name");
var entities = new List<Entity>{entity};
var cs = new ChangeSet("a user", "Added a new entity", DateTime.Now, ApprovalState.Submitted, entities);
repository.Insert(cs);
}
据我所知,一个存储库应该只返回聚合,这意味着为了改变一个Entity
我必须首先搜索一个ChangeSet
没有意义的。即使您仅对聚合根执行更改,返回聚合的子实体也是一种不好的做法吗?
我在互联网上搜索了一个答案,很多人指出这种查询可能会指出聚合的错误设计。这让我再次思考,如果我需要两个聚合而不是一个聚合,一个用于 the ChangeSet
,另一个包含Entity
and EntityHistory
。我应该使用两个聚合而不是一个聚合吗?如果是这样,我如何在单个事务中执行此操作?
两个聚合的进一步指示是用户界面要求,例如“用户想要查看实体的更改历史记录”或“向我显示视图中的所有实体”。一方面,这表明两个聚合,另一方面,我有一种感觉,ChangeSet
并且Entities
应该真正属于一起。
总结一下我的问题:
ChangeSet
和 关联Entities
?特尔;博士:
Entity
需要Entity
知道如何查询ChangeSet
;除非您在服务级别对此进行编排,否则这不是很好的设计。其他想法
如果我理解正确,您正在尝试通过添加审批工作流来执行事件溯源自然会做的事情。Events
Event Store 中的内容大约是您使用ChangeSet
.
如果这是正确的,您可以通过以下方式在 ES 中优雅地建模:
Entity
ChangeEntityCommand
从 API 输入构建一个(命令可能无法通过验证);Entity
;Handler
的Entity
骨料,其进而发射ChangeQueuedForApprovalEvent
。EventHandler
将拦截上面的事件并负责更新批准视图。当审批者开绿灯时,类似的流程将发出ChangeApprovedEvent
包含前一个事件相同数据的 。这个事件是真正改变Entity
.
最后,我不相信 ChangeSet 建模真的适合 DDD,因为它无法捕捉到更改的意图。
希望这对您的项目有所帮助并祝您好运。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句