如何选择DDD聚合?

2024-01-07

In book 通过 C# 示例应用领域驱动设计 in 第4章(第一个草图)在点上4.并发冲突检测很重要我不明白为什么作者选择这个聚合。客户有他自己的聚合,订单有他自己的聚合。

我认为客户应该参考他的订单。

订单仅与客户相关。我没有看到任何一种情况可以通过他的 ID 从数据库获取订单。但是,如果我应用此逻辑,那么在我的域模型中,我几乎没有包含所有实体和值对象的复杂聚合。我不想要这个。

当从数据库中获取客户时,它不会直接加载他的订单(延迟加载)。所以这不是一个论点。

如果客户在不同的场景中使用,那么最好清除客户,因为该参考仅在一种场景中有用。我想这是对订单进行聚合并对他的订单进行“间接引用”的原因之一。

那么选择聚合的真正原因是什么?

我还有一个误会。订单有更多 OrderLine。 OrderLine 有一种产品。为什么允许 OrderLine 引用聚合订单之外的对象(产品)?


我认为客户应该参考他的订单。

建立与存储库查找是对象引用的替代方法。 http://gorodinski.com/blog/2012/07/24/implementing-associations-with-references-or-repositories-in-domain-driven-design-ddd/它在客户和订单之间存在关系的此类情况下很有用,但作为对象引用实现没有意义。之所以如此,有几个原因。一是加载与客户相关的所有订单可能不可行。即使使用延迟加载,您通常也需要一个分页集合。另一个原因是作者所说的并发冲突检测,也称为事务一致性。不存在任何涉及与客户关联的所有订单的行为,并且无需引用所有订单。

当从数据库中获取客户时,它不会直接加载他的 订单(延迟加载)。所以这不是一个论点。

延迟加载可能有问题 http://gorodinski.com/blog/2012/06/16/orm-lazy-loading-pitfalls/。主要原因是实现困难、缺乏灵活性以及代码推理能力的降低。

那么选择聚合的真正原因是什么?

聚合应该是一致性边界。换句话说,聚合界定了一组实体和值对象,这些实体和值对象在与聚合相对应的行为下必须保持一致。这具有业务和技术方面的影响。看一眼有效的总体设计 https://vaughnvernon.co/?p=139了解更多相关信息。

为什么允许 OrderLine 拥有对对象的引用 (产品)外部总订单?

通常,订单行应引用代表订购产品的值对象,而不是对实际产品实体的引用。这部分是由于所讨论的聚合约束,但也因为订单是一个事件并且应该是不可变的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何选择DDD聚合? 的相关文章

  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 重载<<的返回值

    include
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • Dapper 批量插入返回序列 ID

    我正在尝试使用 Dapper 通过 Npgsql 执行批量插入 这会返回新插入行的 id 我的两个示例中都使用了以下插入语句 var query INSERT INTO MyTable Value VALUES Value RETURNIN
  • Java 数组索引越界异常

    当我需要将 5 个用户输入的值存储到一个数组中 将其发送到一个方法 并查找并显示最低值时 我一直在研究这个基本的 java 程序 该程序很简单 并且可以运行 但是当我输入最后一个数字时 出现错误 线程 main 中的异常 java lang
  • 调用 setCenter 后 OpenLayers,地图仍处于 0,0 位置

    我尝试通过 setCenter 方法设置地图中心 但仍然不起作用 地图不动 我尝试使用从投影到地图投影的变换 但没有成功 这是代码的一部分 谢谢
  • Spark Streaming中如何处理旧数据并删除处理后的数据

    我们正在运行一个 Spark 流作业 从目录中检索文件 使用 textFileStream 我们担心的一个问题是作业已停止但文件仍在添加到目录中的情况 一旦作业再次启动 这些文件就不会被拾取 因为它们在作业运行时不是新的或已更改 但我们希望
  • 如果中间缺少数字,则获取数字列的范围(最小/最大)

    如果数字在某处结束然后再次以更高的数字开始 我将如何查询数字列的范围 如果我有一个像这样的专栏 Number 1 2 3 4 5 11 12 13 我怎样才能返回这样的结果 Min Max 1 5 11 13 WITH CTE AS SEL
  • 使用“mailto:”方案通过意图发送电子邮件附件

    我正在使用此代码附加文件 final Intent emailIntent new Intent android content Intent ACTION SENDTO String uriText Uri file Uri fromFi
  • MVC 将方法添加到 jquery.validate.unobtrusive.js 中

    我最近有一个问题使复选框验证工作 https stackoverflow com questions 6923430 mvc unobtrusive validation on checkbox not working 6931490 69
  • 如何使用比较器定义自定义排序顺序?

    我想开发一个汽车列表排序演示 我正在使用数据表来显示汽车列表 现在实际上我想按汽车颜色对列表进行排序 这里不按字母顺序排序 我想使用我的自定义排序顺序 例如首先是红色汽车 然后是蓝色汽车 等等 为此我尝试使用JavaComparator h
  • 仅要求和测试命名参数

    我有一个旨在接受命名参数的脚本 我想在未命名或命名错误的参数的情况下提供一些错误检查 并且我看到了一些奇怪的情况 该脚本以参数块开头 如下所示 param string Alias s sets string Alias l locatio
  • C# 中的树形数据结构

    我正在寻找 C 中的树或图数据结构 但我想没有提供 使用 C 2 0 对数据结构进行广泛检查 http msdn microsoft com en us library ms379574 aspx关于为什么 是否有一个常用的方便的库来提供此
  • 为什么Python for循环中的临时变量计算会占用这么多内存? [复制]

    这个问题在这里已经有答案了 下面两段代码是等价的 但是第一个代码占用了大约700M内存 后一个代码只占用了大约100M内存 通过Windows任务管理器 这里会发生什么 def a lst for i in range 10 7 t a t
  • python Qt:主小部件滚动条

    我们试图在主窗口部件上放置滚动条 因此如果用户调整主窗口的大小 滚动条就会出现 并让他上下移动以查看较小窗口部件之外的子部件 从而允许其左右移动 这是带有滚动条的主小部件的代码 def centralWDG self MainWindow
  • 带有关键字参数的 PyObject_CallMethod

    我正在尝试在我的 C 应用程序中嵌入 Python 2 7 库 并且使用 Python C API 从 C 调用 Python 代码 我需要调用采用关键字参数的 Python 方法 从语义上讲 我试图在 Python 中实现与以下行等效的效
  • 对字符串使用小于比较运算符

    我正在关注 C 教程 并查看字符串和运算符重载 例如 目前我有一个简单的 if 语句 if s1 lt s2 cout lt lt s2 lt
  • PHP - 按原样显示小浮点数

    我必须显示一个计算出的数字 有时它非常小 显示如下 1 0E 8 我怎样才能显示它 0 00000001 http php net manual en function number format php http php net manu
  • GraalVM - 在没有上下文的情况下使用多语言值

    我正在 Graal 之上编写一个应用程序 它将能够执行不同语言的小脚本 我正在尝试为一个类编写一些单元测试 我正在使用该类将 Context eval 调用 类型 Value 的结果转换 处理为 Java 对象 我从文档中知道 Value
  • 代码完成未给出建议

    假设我正在使用 requests Python 库 req requests get http google com Now after this if I type req I m supposed to get a list of al
  • 在 git 中,如何从一个分支中删除提交并将其应用到另一个分支?

    我有两个来自 master 的分支 每个分支都有不同的功能 然后我有一个将两者结合起来的综合分支 我向综合分支提交了一些内容 但现在我发现我宁愿将该更改应用到特定于该功能的分支之一 有没有办法用 git 在其他地方执行此取消应用 应用操作
  • SQL Server - 从经度和纬度到几何数据类型[重复]

    这个问题在这里已经有答案了 可能的重复 SQL Server 2008 Spatial 在多边形中找到一个点 https stackoverflow com questions 11054149 sql server 2008 spatia
  • 如何选择DDD聚合?

    In book 通过 C 示例应用领域驱动设计 in 第4章 第一个草图 在点上4 并发冲突检测很重要我不明白为什么作者选择这个聚合 客户有他自己的聚合 订单有他自己的聚合 我认为客户应该参考他的订单 订单仅与客户相关 我没有看到任何一种情