将多个子实体添加到根聚合或调用多个责任库

本文关键字:调用 责任 实体 添加 | 更新日期: 2023-09-27 18:06:11

我有一个实体A,它有三个子实体X, Y和z

我也有一个通用的存储库之一漂浮在网络上…

在我的服务方法AXYZ()

我做多个存储库调用:(伪代码)

repoA.Update(objectA);
repoY.Delete(objectA.PK_Id);
foreach:
  objectX.FK_ID = objectA.PK_ID;
  repoX.Add(objectX);
foreach:
  objectY.FK_ID = objectA.PK_ID;
  repoY.Add(objectY);
foreach:
  objectZ.FK_ID = objectA.PK_ID;
  repoZ.Add(objectZ);
  _unitOfWork.Commit();

现在我问自己,是不是每件事都做得足够好?而不是在repoXXX上添加操作对子集合执行Add操作?:

repoA.Update(objectA);
repoY.Delete(objectA.Id);
foreach:
  objectA.CollectionX.Add(objectX);
  objectA.CollectionY.Add(objectY);
  objectA.CollectionZ.Add(objectZ);
  _unitOfWork.Commit();

一个旁注:

由于objects_Y没有加载到上下文中,所以不能在内存中执行删除操作。

你觉得怎么样?

我也用领域驱动设计标记了这个问题,也许这个场景与它有关?

将多个子实体添加到根聚合或调用多个责任库

如果您实际上是从DDD的角度来处理这个问题,那么对我来说,您有所有子实体的存储库,而不仅仅是聚合根A。显然,每个项目都是不同的,DDD是一组通常有意义的指导方针。但是,我希望repoA处理所有四个实体的加载和持久化,除非X、Y和Z有作为聚合根的角色。RepositoryA可以处理加载和持久化X, YZ对象从不同的来源,如果他们不是全部存储在一个记录,但我不希望单独的存储库。

除了规范的DDD正确性之外,我鼓励您考虑这些关系在域层中是如何工作的。foreach方法意味着使用setter,而添加集合意味着业务对象以一种可以用通用语言表示的方式建立关系。

我认为后一种方法更"正确",但我想稍微修改一下:

repoA.Update(objectA);
repoY.Delete(objectA.Id);
foreach:
  objectA.addX(objectX);
  objectA.addY(objectY);
  objectA.addZ(objectZ);
  _unitOfWork.Commit();

改变子实体的操作通常暴露在聚合根本身,因为它知道如何维护它所需要的不变量。

希望这有帮助。但是,我不知道你的全部情况。这将有助于更多地了解AXYZ()正在做什么。