0

我有一个实体 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 上执行所有 foreach.Add 操作是否不够或更好,而只是对子集合执行 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 未加载到上下文中,因此无法在内存中对 repoY 执行删除操作。

你怎么看?

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

4

1 回答 1

0

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

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

我认为你的后一种方法更“正确”,但我会稍微改变它:

repoA.Update(objectA);
repoY.Delete(objectA.Id);

foreach:
  objectA.addX(objectX);
  objectA.addY(objectY);
  objectA.addZ(objectZ);

  _unitOfWork.Commit();

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

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

于 2013-03-31T03:25:59.337 回答