如何访问聚合边界内的实体

马克杯4N

我目前正在尝试在 DDD 中编写一个应用程序,允许创建、更新和删除实体。对实体的更改必须得到另一个人的批准。应用程序还必须跟踪对实体所做的更改。简化的域模型如下所示:

在此处输入图片说明

应用程序具有含有一个界上下文ChangeSetEnity以及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,另一个包含Entityand EntityHistory我应该使用两个聚合而不是一个聚合吗?如果是这样,我如何在单个事务中执行此操作?

两个聚合的进一步指示是用户界面要求,例如“用户想要查看实体的更改历史记录”或“向我显示视图中的所有实体”。一方面,这表明两个聚合,另一方面,我有一种感觉,ChangeSet并且Entities应该真正属于一起。

总结一下我的问题:

  • 我应该在我的设计中使用一两个聚合吗?
  • 如果一个聚合:即使您仅通过聚合根执行更改,返回聚合的子实体是否是一种不好的做法?
  • 如果两个聚合:如何在一个事务中保存ChangeSet和 关联Entities
亚历山德罗·桑蒂尼

特尔;博士:

  • 您应该使用一个实体。
  • 是的,这是不好的做法,因为行为应该由聚合公开;此外,重建Entity需要Entity知道如何查询ChangeSet除非您在服务级别对此进行编排,否则这不是很好的设计。
  • 你不应该这样做,因为聚合根代表,恕我直言,一个事务边界

其他想法

如果我理解正确,您正在尝试通过添加审批工作流来执行事件溯源自然会做的事情EventsEvent Store 中的内容大约是您使用ChangeSet.

如果这是正确的,您可以通过以下方式在 ES 中优雅地建模:

  • 调用Edit Entity API,该 API 将大量更改作为输入Entity
  • API:
    • ChangeEntityCommand从 API 输入构建一个(命令可能无法通过验证);
    • 检索Entity;
    • 调用相应HandlerEntity骨料,其进而发射ChangeQueuedForApprovalEvent
    • 提交 EventStore 中的实体
  • AnEventHandler将拦截上面的事件并负责更新批准视图。

当审批者开绿灯时,类似的流程将发出ChangeApprovedEvent包含前一个事件相同数据的 。这个事件是真正改变Entity.

最后,我不相信 ChangeSet 建模真的适合 DDD,因为它无法捕捉到更改的意图。

希望这对您的项目有所帮助并祝您好运。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章