2

存储库模式表明您只能拉取聚合根。但是,如果您不知道它是父级(root),您将如何仅使用唯一身份(Child.ID)检索单个孩子?在集合根中搜索儿童

class Parent 
{ 
    public int ID { get; set; } 
    IEnumerable<Child> Children { get; private set; } 
} 

class Child 
{ 
    public int ID { get; private set; } 
    public virtual Parent Parent { get; private set; } // Navigational model 
} 

我的应用程序是无状态的(网络),为简单起见,请求只包含孩子的ID。

我想到了三种方法:

  1. 呼叫所有的家长则问他们礼貌谁拥有这个孩子。
  2. 在ParentRepository中有一个名为get GetChildByID的特殊例程,它会使存储库的抽象化失败。
  3. 修改请求以包含父项,但似乎不必要,因为您已具有唯一标识。
+1

在“ChildRepository”类中创建'GetChildByID(..)'方法? –

+4

如果你没有父母可以识别他们,那么孩子应该是一个总分。 – Hippoom

+0

@Hippoom我对Aggregate Root的了解是有限的,你是说只要一个实体具有唯一的身份,那么他们可以被视为根?我更新了代码示例。 – Yorro

回答

2

看起来你可能在这里看到了不同的有界的上下文。您在您的问题中提到“存储库...只能拉取聚合根。”;这是对的。另一个答案还提到,如果您需要查询子对象,则子对象也可能是聚合根。这也可能是在不同的有界环境中是正确的。一个实体很可能在一个上下文中成为一个聚合根,而在另一个上下文中成为一个实体。

Users的域名为例,他们已经在他们的设备上安装了移动/平板电脑Apps。在用户的情况下,我们可能需要用户的基本属性,如姓名,年龄等,我们可能还需要用户在其设备上安装的应用程序列表。在这种情况下,User是聚合根,App是值对象。

bounded context UserApps 
{ 
    aggregate root User 
    { 
     Id : Guid 
     Name : string 
     Age : int 
     InstalledApps : App list 
    } 

    value object App 
    { 
     Id : Guid 
     Name : string 
     Publisher : string 
     Category : enum 
    } 
} 

在另一种情况下,我们可以把世界的App中心的视图,并决定App是聚合根。举例来说,我们想报告哪些用户安装了给定的应用程序。

bounded context AppUsers 
{ 
    aggregate root App 
    { 
     Id : Guid 
     Name : string 
     InstalledBy : User list 
    } 

    value object User 
    { 
     Id : Guid 
     Name : string 
     InstalledOn : Date 
    } 
} 

这两个有界上下文都有自己的仓库,它返回相应的聚合根。您对数据的观点存在微妙而关键的差异。

我想如果你退后一步,想想为什么你想查询一个子对象,你可能会发现你实际上在一个完全独立的有界上下文中。

+0

对不起,谢谢你的回复。我会接受这是我需要的最接近的答案。我现在明白,聚合根根据上下文而改变。 我还发现了一篇不错的文章,进一步帮助我理解这个问题。 http://www.sapiensworks.com/blog/post/2012/04/18/DDD-Aggregates-And-Aggregates-Root-Explained.aspx – Yorro

0

如果您需要孩子显示/报告/查看/报告,那么一个简单的查询图层就可以做到。

如果你以任何方式操纵孩子,那么它有一个一致性边界,这听起来像一个聚合非常多。

尽量不要查询您的域对象。另一个简单的经验法则是不要在另一个集合中包含集合引用,而是仅使用引用的集合的Id或者表示关系的值对象。

0

实体导航不是域模型的目的。
聚合根是实体和值的组合,用于公开业务操作。
作为副作用,您仍然可以通过AR执行一些简单的查询或导航,但是对于复杂的查询,创建和使用查询模型会更有效。
我在说CQRS

希望这可以帮助你。