领域驱动设计:如何访问聚合根的子级

2024-01-03

如果我有一个订单类作为聚合根和 1000 个订单项。

如何仅加载 1000 个订单项中的一个?据我了解,订单项只能通过 Order 类访问,并且具有“本地”标识。我是否仍会在 OrderRepository 中创建像“GetLineItemById”这样的存储库方法?

编辑评论答案:目前我认为拥有一个一成不变的孩子是不合理的。如果我有一个包含多个地址、合同甚至更多子集合的 Customer 类,该怎么办?我想在一个巨大的实体上执行 CRUD 方法。

我会

public class Customer
{
    public IEnumerable<Address> Addresses { get; private set; }
    public IEnumerable<Contracts> Contracts { get; private set; }
    ...
}

如果用户更正地址的街道或合同的属性,我是否必须执行类似的操作?

public class Customer
{
    public void SetStreetOfAddress(Address address, street){}

    public void SetStreetNumberOfAddress(Address address, streetNumber){}
}

那么客户类将充满子操作方法。所以我宁愿这样做

addressInstance.Street = "someStreet";

我想我误解了整个概念..:)


  1. 通过简单的只读属性或 get 方法访问聚合根的子级没有任何问题。

重要的是要确保所有互动与孩子的关系是由聚合根调节的,因此有一个单一的、可预测的地方来保证不变量。

So Order.LineItems没问题,只要它返回(公开)不可变对象的不可变集合。同样地Order.LineItems[id]。有关示例,请参阅经 Evans 批准的规范 ddd 示例的来源 http://sourceforge.net/projects/dddsample/files/DDDSample%20Source/,其中聚合根Cargo类公开了它的几个子实体,但子实体是不可变的。

  1. 聚合根可以保存对其他聚合根的引用,但它们不能相互改变。

如果你有“蓝皮书”(领域驱动设计 https://dddcommunity.org/books/),请参阅第 127 页的示例,其中显示了您可能如何Car.Engine,其中两者Car and Engine是聚合根,但引擎不是汽车聚合的一部分,您不能使用以下任何方法对引擎进行更改Car(或相反亦然)。

  1. 在领域驱动设计中,您不必使所有类聚合根或聚合的子级。您只需要聚合根来封装一组内聚的类之间的复杂交互。这Customer您提出的类听起来根本不应该是聚合根 - 只是一个包含引用的常规类Contract and Address聚合体。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

领域驱动设计:如何访问聚合根的子级 的相关文章

  • 如何在 C# 中以编程方式创建柔和的颜色?

    根据所需的颜色数量均匀分布地生成它们 如果指定的计数为 8 则看起来像这样 List
  • Java有没有类似微软CHESS的工具?

    是否有类似于 Microsoft 的现有 Java 工具CHESS http research microsoft com chess 或者 CHESS 源代码是否开放 以便我可以尝试将其转换为 Java 谷歌的织线工 http code
  • 如何让 LinqToSql 将“索引提示”传递给 sql server?

    由于我们不能相信我们的客户会更新 sql server 中的索引统计信息等 因此我们过去不得不使用索引提示 http www sql server performance com tips hints general p1 aspx 由于我
  • 找不到 Microsoft.Office.Interop Visual Studio

    我正在开发一个使用 C 发送电子邮件的应用程序 该应用程序将能够使用邮件模板等 问题是我无法找到任何 Office Interop 引用 这意味着我无法使用 Outlook 我的计算机上安装了 Office 但我也尝试从此链接安装 PIAh
  • 设置 Form.KeyPreview = true 的缺点?

    我想知道 Form KeyPreview 属性实际上有什么用处 它为什么存在以及将其设置为 true 会带来什么 风险 我想它一定有some负面影响 否则它根本不应该存在 或者至少默认情况下是正确的 EDIT 我很清楚what确实如此 我问
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 取消任务

    我尝试运行一个关于取消任务的简单示例 如下所示 CancellationTokenSource tokenSource2 new CancellationTokenSource CancellationToken token2 tokenS
  • 家庭自动化图书馆[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是一名 C 开发人员 希望将家庭自动化作为一种 爱好 我做了一些研究 但想知道是否有人知道支持 In
  • 如何有效确保小数值至少有 N 位小数

    我想在进行算术运算之前有效地确保十进制值至少有 N 个位置 在下面的示例中 3 显然我可以格式化 0 000 然后解析 但它的效率相对较低 我正在寻找一种避免与字符串转换的解决方案 我尝试过以下解决方案 decimal d 1 23M d
  • 访客模式如何不违反开放/封闭原则?

    来自维基百科 这个想法是 一旦完成 类的实现只能修改为 纠正错误 新的或更改的功能将需要创建不同的类 该类可以通过继承重用原始类的代码 据我了解 访问者模式是一种强大的技术 可以通过使用双重分派来遍历实现相同接口的相似但不同的对象 在我的一
  • 委托给子组件的模式

    在我正在工作的产品中 非常基本的场景之一是类的序列化 通常 要序列化的类会在其子组件上调用序列化 例如如果有一个类 s t 班级 A B C D 那么A Pack会调用pack B C D 上的函数 由于有很多这样的类 因此必须一遍又一遍地
  • 在 C#.NET 应用程序中使用 SQL Server 时间数据类型?

    如何使用 SQLtimeSQL Server 2008 中 C NET 中引入的数据类型 我一直在努力让它发挥作用 但没有成功 这是一个MSDN 文章 http msdn microsoft com en us library bb6751
  • 使用其他聚合中的数据检查命令的有效性

    我目前正在开发我的第一个更大的 DDD 应用程序 目前来说 它运行得很好 但我们从早期就陷入了一个让我无法停止思考的问题 在我们的一些聚合中 我们保留对另一个聚合根的引用 这对于整个应用程序非常重要 基于它们的 ID 因此不存在硬引用 删除
  • 尝试对无法访问的主机进行套接字操作

    一位客户在连接到我们的服务器服务的 WCF 客户端上报告了此错误 消息 尝试对无法访问的主机进行套接字操作 类型 System Net Sockets SocketException 从这个链接http msdn microsoft com
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • IEnumerable 与 IReadOnlyList

    选择有什么区别IEnumerable
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur

随机推荐

  • 努力将 Objective C 选择器和目标签名转换为 Swift

    再会 我正在尝试将 Objective C 代码片段转换为 Swift 我知道选择器可以通过将其放入字符串中来直接翻译 但我无法理解 Objective C 签名 Objective C 选择器 第二个参数 UIImageWriteToSa
  • React Native FAILURE:构建失败并出现异常。无法解析“:classpath”。找不到 com.android.tools.build:gradle:3.0.1

    当我发出命令 react native run android 时 它发生了 失败 构建失败并出现异常 What went wrong A problem occurred configuring root project AsomePro
  • 同时写入同一个文件

    好的 我知道这个网站上有关于这个问题的类似问题 但是这些问题和提供的答案都不是我所需要的 我正在构建基于平面文件的 CMS 例如 如果 2 3 10 追加模式下的fwrite请求同时到达同一个php文件 contact form messa
  • 将变量声明为无符号的重要性

    如果您知道变量永远不应该为负数 那么将变量声明为无符号是否重要 它是否有助于防止除负数之外的任何内容被输入到不应该包含负数的函数中 将语义上非负值的变量声明为unsigned是一种良好的风格和良好的编程实践 但是 请记住 这并不能阻止您犯错
  • PHP 解析 .dat 文件

    我有一个 dat 文件 本质上是 分隔文件 我正在尝试将其转换为制表符分隔的 txt 我不确定的问题是新文件的每一行将是原始文件的 3 行的组合 每个原始行都有不同数量的数据 第一列仅标识分组中的每一行 最好的方法是什么 原始数据样本 01
  • python:如何在服务器端检测客户端断开连接?

    我正在用 python 进行套接字编程 我想在服务器端检测客户端套接字断开连接 Client socket connect host port try send something to server and get response fr
  • pandas 统计每个日期过去 7 天的值

    有两个数据框 首先是这样的 print df1 id date month is buy 0 17 2015 01 16 2015 01 1 1 17 2015 01 26 2015 01 1 2 17 2015 01 27 2015 01
  • Jetty 的 httpClient.setResponseBufferSize() 方法有什么作用吗?

    我正在使用 Jetty 的 HttpClient 构建一个简单的代理服务器 我在 Java 1 8 0 45 上使用 Jetty 版本 9 3 10 v20160621 我遇到过这样的情况 我对资源执行 GET 操作 该资源将返回大小约为
  • “<”附近的语法不正确

    我的任务是获取一些在 SQL Server 2012 上正常工作的代码 以便在 SQL Server 2008 R2 上也能正常工作 我收到这个错误 附加信息 当我尝试运行我的代码时 我发现这行 SQL 代码有问题 ALTER TABLE
  • Apollo Link 响应标头

    我在一个简单的 React 应用程序中使用最新版本的 Apollo Client 并尝试从响应中提取一个标头值 该标头值用于显示返回的记录集的大小 我意识到这不是提供结果集大小的最优雅的方式 但这就是 API 目前的设置方式 我希望使用中间
  • Keycloak 用户临时锁定的自定义消息

    我正在使用 Kyecloak 4 8 0 并为我的领域启用了暴力攻击 现在 每当用户提供错误凭据 3 次时 用户将被暂时锁定 但用户仍然会看到 无效的用户名 密码 根据这个帖子 Keycloak 是故意这样做的 https issues j
  • Google Cloud Storage 设置缓存控制并签名 URL 上传

    我们使用签名网址从浏览器上传 我无法弄清楚如何在上传时设置缓存控制标头 我们使用 gcloud node 库来签署网址 var bucket gcs bucket mybucket var file bucket file image jp
  • 使用 SUM(something) AS 时字段列表中的未知列

    我正在使用以下查询从表中获取 2 列的总和 SELECT a user b user SUM a post b post AS common p count SUM a option b option AS common r count c
  • 如何更改 apt-get 安装目录[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 apt get的默认安装目录是 opt 我可以将其更改为其他目录吗 我能想到的最好的方法是使用符号链接 请注意 并非所有程序都安装到同一目
  • 使用 jQuery 对 div 进行排序

    I m trying to sort divs using jQuery it does sort but does not seems sorting properly 这是申请后的样子sort here is HTML片段 div cl
  • C - 如何更改 Ncurses 中的字体大小?

    到底还有吗 我似乎找不到任何执行此操作的函数 我尝试用谷歌搜索这个但找不到任何东西 我不相信这是可能的 终端不适合做这样的事情 它旨在有时以不同的颜色显示文本 如果你想改变字体大小 你需要打开一个窗口并绘制它 这实际上可能不是正确的术语 图
  • Java中两个日期相减[重复]

    这个问题在这里已经有答案了 可能的重复 计算两个 Java 日期实例之间的差异 https stackoverflow com questions 1555262 calculating the difference between two
  • 当有人说 Perl 是一种“富有表现力的语言”时,这是什么意思?

    什么是表达性语言 当有人说 Perl 是一种富有表现力的语言时 这是什么意思 表达性 语言是一种允许您轻松地用代码表达逻辑概念的语言 人们通常称 Perl 富有表现力 因为它允许您使用许多不同的方法来表达特定的概念 因此在这方面它非常灵活
  • Java Jackson org.codehaus.jackson.map.exc.UnrecognizedPropertyException

    我正在使用 Jackson 将 JSON 响应绑定到我的类 一切都运行良好 除非我的 JSON 响应中的字段多于我的类定义的字段 我希望 Jackson 忽略我的 JSON 响应中不存在的字段 这是由于未来版本的兼容性 如果我添加一个新字段
  • 领域驱动设计:如何访问聚合根的子级

    如果我有一个订单类作为聚合根和 1000 个订单项 如何仅加载 1000 个订单项中的一个 据我了解 订单项只能通过 Order 类访问 并且具有 本地 标识 我是否仍会在 OrderRepository 中创建像 GetLineItemB