gpt4 book ai didi

c# - 跨聚合根搜索 child

转载 作者:太空宇宙 更新时间:2023-11-03 10:53:58 28 4
gpt4 key购买 nike

存储库模式建议您只能提取聚合根。但是,如果您不知道它的父级(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
}

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

我正在考虑三种方法:

  1. 调用所有的 parent ,然后礼貌地询问他们谁拥有这个 child 。
  2. 在 ParentRepository 中有一个名为 getChildByID 的特殊例程,这有点失败了存储库的抽象。
  3. 修改请求以包括父级,但这似乎没有必要,因为您已经拥有唯一身份。

最佳答案

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

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
}
}

这两个限界上下文都有自己的存储库,该存储库返回各自的聚合根。您对数据的看法存在细微但至关重要的差异。

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

关于c# - 跨聚合根搜索 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20189421/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com