gpt4 book ai didi

c# - DDD : Lazy loading in aggregates

转载 作者:行者123 更新时间:2023-12-04 00:58:55 24 4
gpt4 key购买 nike

过去几天我一直在学习 DDD 并且努力理解聚合根的一些核心概念。也许有人可以让我朝着正确的方向前进,并详细说明在这种情况下的最佳实践:

为了让这个例子不那么复杂,假设我们有一个包含两个实体的域:餐厅和营业时间。餐厅被定义为聚合根。

Text

根据我在所有在线示例中的理解(如果我弄错了请纠正我),每次我需要一个实例时,聚合根都会急切地加载所有子实体。因此,每当我想在餐厅调用 call 方法时,都会加载所有开放时间(无论是否使用它们)。

在这个例子中,我想验证当新的时间被添加到该餐厅时,没有开放时间的交集。在这种情况下,每隔一个开放时间的急切加载是有意义的,因为我需要将它们与现有的进行比较。

但是:这是一种限制,因为我知道每次我想添加另一个集合(比如餐厅图片)时,SQL 负载会越来越重,即使大多数方法只需要一个集合。

我可以想到两种可能的解决方案:

懒加载

通过 Entity Framework 属性代理延迟加载打开时间/子实体。所以聚合根可以存在而无需急切加载它们,但只要需要它们就可以访问它们。
然而,无论我在哪里寻找答案,我都认为聚合根中的延迟加载被认为是不好的做法。也许有人可以解释为什么。

较小的聚合根

当然,我可以将开放时间本身定义为聚合根,但随后我需要将业务逻辑(在本例中为交叉点的验证)置于模型之外。

在上面的所有示例中,我只讨论命令端(不是查询或序列化)。

也许我错过了一些基本的想法。在这个例子中应该如何组织聚合根,为什么延迟加载被认为是不好的做法?

编辑
不知道为什么这个问题因为“基于意见”而被关闭。我要求最佳实践以及为什么在这种情况下不进行延迟加载。

最佳答案

此问题归类为集合验证问题,并且根据域需求有一些潜在的解决方案。

强一致性

  • 创建一个 AR 来保护整个集合。在上面的例子中,如果这样的集合有一个合理的长度,你可以创建一个专用的 RestaurantSchedule应收账款。您甚至可以将此类 AR 进一步划分为 RestaurantWeekSchedule你每周有 1 个 AR。当您想添加/删除开放日时,它会创建/加载给定周的 AR。另一种选择是调整 ORM 以仅加载集合的一个子集,例如schedule = scheduleRepo.loadForWeek(openingTime.week()); schedule.add(openingTime); .乐观锁定仍然允许检测冲突。
  • 在数据库中强制执行规则。例如,如果您有一个关系数据库,您可能有 OpeningTime作为 AR,然后使用唯一约束来防止违规。该规则最终会出现在域之外,但它可能是可以接受的。唯一性规则并不那么有趣。

  • 最终一致性

    处理集合验证问题的一种非常常见的方法是避免尝试避免违规,并专注于事后通过手动或自动补偿操作来检测和纠正违规。这可以像显示重叠条目的异常报告一样简单,也可以像 OpeningTimeAdded 的单线程监听器一样复杂。检查冲突并将此类条目标记为更正的事件。

    关于c# - DDD : Lazy loading in aggregates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60282613/

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