DDD与多对多聚合路由关系
DDD and many to many aggregate route relationship
我是 DDD 的新手,我正在为聚合路由的概念及其在 ASP .NET Core 中的实现而苦苦挣扎。
基本上,我有两条聚合路由(AR):
- 用户
- 组
可以有多个用户的组,每个用户可以属于许多不同的组。
如果我理解正确,聚合路由的规则关系如下:
- 聚合路由应该是可序列化的(无循环关系)
- 聚合路由不能有导航属性指向另一个聚合路由
事实上,一个 AR 不应该导航 属性 到另一个意味着我必须以某种不同的方式连接它们,例如使用 ValueObject。
ValueObject:UserToGroup(由于可序列化,不能有导航属性)
- GUID 用户 ID
- GUID GroupId
AR 用户:
- GUID ID
- ICOLLECTION
组
AR 组
- GUID ID
- ICOLLECTION
用户
通过这个设置,我设法按照规则获得了一切。但是出现了一个无法解释的问题。 如何查询组中的所有用户?
例如,我可以这样做(使用 LINQ):
var ids = group.Users.Select(g => g.UserId)
var usersFromGroup = userRepository.FetchByIds(ids)
但这似乎有点愚蠢,我觉得我基本上扼杀了 EF 最好的功能之一,导航属性...
关于如何以某种更好的方式实现它的任何建议?
非常感谢您的回复。
布鲁诺
我的建议是永远不要查询领域模型。
在某些情况下,查询中所需的完整数据可能会 available/surfaced 在域对象(聚合根)的特定实例中。但是这个more-often-than-not不是这样的
查询应该是一个特定的问题,并尽可能靠近数据存储。通常,数据要么以某种 low-level 数据结构返回,例如 DataRow
或者 读取模型 (数据传输对象)。领域对象永远不应该跨越电线(好吧,这是我的看法)。
为了查询,我将使用 ISomethingQuery
的实现,其中我的域交互将通过 ISomethingRepository
。通过这种方式,您可以远离导航属性和奇怪的东西,例如“lazy-loading”。您可以指定所需的数据。
上述结构通常会导致 ORM 不一定增加很多价值但 YMMV 的情况。
我是 DDD 的新手,我正在为聚合路由的概念及其在 ASP .NET Core 中的实现而苦苦挣扎。
基本上,我有两条聚合路由(AR):
- 用户
- 组
可以有多个用户的组,每个用户可以属于许多不同的组。
如果我理解正确,聚合路由的规则关系如下:
- 聚合路由应该是可序列化的(无循环关系)
- 聚合路由不能有导航属性指向另一个聚合路由
事实上,一个 AR 不应该导航 属性 到另一个意味着我必须以某种不同的方式连接它们,例如使用 ValueObject。
ValueObject:UserToGroup(由于可序列化,不能有导航属性)
- GUID 用户 ID
- GUID GroupId
AR 用户:
- GUID ID
- ICOLLECTION
组
AR 组
- GUID ID
- ICOLLECTION
用户
通过这个设置,我设法按照规则获得了一切。但是出现了一个无法解释的问题。 如何查询组中的所有用户? 例如,我可以这样做(使用 LINQ): var ids = group.Users.Select(g => g.UserId) var usersFromGroup = userRepository.FetchByIds(ids)
但这似乎有点愚蠢,我觉得我基本上扼杀了 EF 最好的功能之一,导航属性...
关于如何以某种更好的方式实现它的任何建议?
非常感谢您的回复。
布鲁诺
我的建议是永远不要查询领域模型。
在某些情况下,查询中所需的完整数据可能会 available/surfaced 在域对象(聚合根)的特定实例中。但是这个more-often-than-not不是这样的
查询应该是一个特定的问题,并尽可能靠近数据存储。通常,数据要么以某种 low-level 数据结构返回,例如 DataRow
或者 读取模型 (数据传输对象)。领域对象永远不应该跨越电线(好吧,这是我的看法)。
为了查询,我将使用 ISomethingQuery
的实现,其中我的域交互将通过 ISomethingRepository
。通过这种方式,您可以远离导航属性和奇怪的东西,例如“lazy-loading”。您可以指定所需的数据。
上述结构通常会导致 ORM 不一定增加很多价值但 YMMV 的情况。