如何定义分层数据结构的DDD聚合根?

2024-04-04

我目前正在尝试将领域驱动设计原则应用于我的开发实践。我一直致力于如何为按层次结构组织的数据定义聚合根。

我们以文件夹结构为例 - 每个文件夹可以有 0..N 个子文件夹,子文件夹 0..N 也可以有 0..N 个子文件夹,依此类推。

我对文件夹及其所有直接和间接子文件夹有不变量 - 删除文件夹应导致删除其所有子文件夹

这是否是 DDD 有效的方法,让我们说聚合根“文件夹层次结构”,其中包含 1 个“文件夹”实体(这将是该文件夹层次结构的“标题”文件夹),并且每个文件夹实体有 0..N 个文件夹实体(子-文件夹)

这是有效的 DDD 吗?这样会有效果吗?因为我读到 DDD 主张拥有小聚合,但这个“文件夹层次结构”可能是一个巨大的聚合......

具有深层层次结构的聚合根在 DDD 中是否合适? https://stackoverflow.com/questions/13647490/is-aggregate-root-with-deep-hierarchy-appropriate-in-ddd

Vaughn Vernon 的有效聚合设计 http://dddcommunity.org/library/vernon_2011/

有什么建议可以让 DDD 有效且有效吗?

EDIT

让我们看一个具有树状结构的对象的稍微不同的示例。假设我需要开发一个任务跟踪系统,并且该系统需要任务具有非固定级别的子任务 - 所有任务从功能/行为角度来看都是相同的 - 每个任务可以有 0..1 个父任务和 0 个任务。 .N个子任务。

Having Task作为聚合根(及其所有子任务层次结构)不会遵循 DDD 建议来拥有小聚合 - 对吗?

什么是好的设计Task根据 DDD 原则?以及如何在 a 上实现不变量Task(及其子任务层次结构)如果Task(及其层次结构)不是一个聚合?


您应该围绕不变量对聚合进行建模。一条经验法则是聚合应该一次性加载到内存(及其所有子对象),而不是延迟加载。

您真的有一个需要加载整个层次结构的不变量吗?是否存在需要遍历层次结构中所有节点的情况?要回答这个问题,您需要考虑聚合的用例。

如果您需要所有数据,那么您的聚合就有适当的大小,它不能再小了。如果您的不变量只需要图的一小部分,那么您可能缺少一些描述该图部分的域概念。

如果您只关心更新祖先的时间,那么您的任务可能只包含您不需要子集合的父属性。然后你可以执行类似的事情

public void RegisterTime(TimeSpan time)
{
    TimeSpent += time;
    // maybe more stuff here
    Parent.RegisterTime(time)
}

然后你的存储库将只获得包含其所有祖先的任务,并且聚合将足够小。

我只是猜测,因为它总是取决于用例。

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

如何定义分层数据结构的DDD聚合根? 的相关文章

随机推荐

  • 为什么drawRect:在不调用[superdrawrect:rect]的情况下工作?

    我在我的视图之一中重写了drawRect 即使不调用 superdrawrect rect 它也能工作 这是如何运作的 void drawRect CGRect rect CGContextRef context UIGraphicsGet
  • Angular `HttpClient` `.get()` 泛型可以有非简单属性类型吗? (例如“字符串”或“数字”除外)

    我花了一天时间研究这个主题 但没有找到任何线索 我所找到的只是omission 因为我读过的任何内容都表明你can使用非简单类型 我的意思是string and number 用于调用 Angular 4 4 时的通用接口 shape Ht
  • 如何正确配置照片文件以匹配 html input.files 的格式与 Cordova 相机?

    我有一个现有的网络服务 可以处理用户输入的照片 以及其他一些数字和文本数据 照片是通过输入标签捕获的
  • 使用 PHP 变量执行 Python 脚本

    我正在编写一个简单的应用程序 它使用表单中的信息 通过 POST 将其传递到 PHP 脚本 该脚本执行 python 脚本并输出结果 我遇到的问题是我的 python 脚本实际上并未在传入参数的情况下运行 process3 php 文件
  • .NET 有没有好的图像识别库?

    我希望能够将网络摄像头拍摄的图像与计算机上存储的图像进行比较 该库不需要百分百准确 因为它不会用于任何关键任务 例如警方调查 我只想要一些我可以使用的东西 我尝试过一个演示项目CodeProject 的图像识别 http www codep
  • CUDA错误:在python中使用并行时初始化错误

    我的代码使用 CUDA 但运行速度仍然很慢 因此 我将其更改为使用 python 中的多处理 pool map 并行运行 但我有CUDA ERROR initialization error 这是函数 def step M self ite
  • 以 Fortran 连续顺序重塑 numpy.array

    我有一个如下所示的数组 from numpy import a array 1 2 3 4 5 6 7 8 9 我想得到如下结果 1 4 7 2 5 8 3 6 9 因为我有一个很大的数组 所以我需要一种有效的方法来做到这一点 最好就地重塑
  • 来自 Blackberry Phonegap 应用程序的 Ajax 请求

    我正在为 Blackberry 操作系统 5 0 及更高版本 创建一个应用程序 我过去没有任何移动开发经验 我创建了一个运行良好的示例应用程序 按照中提到的准则http wiki phonegap com w page 31930982 G
  • 基于 php 示例的 C++ 中数据结构的多态性示例

    我正在学习多态 并且熟悉php 我发现了这个很好的例子https stackoverflow com a 749738 80353 https stackoverflow com a 749738 80353 转载如下 如何用 C 编写相同
  • 调用 C 子例程时出现 JNI 错误

    我想从 Java 调用 C 子例程 我正在使用 JNI 我创建了 java c 和 h 文件 并编译了 DLL 所有文件都在同一个文件夹中 但是当我运行该程序时 它显示unsatisfiedlinkError 我哪里出错了 在学习JNI时
  • 更新某些类别的左列/如何在布局文件中设置类别 ID

    我想要一个在左侧显示某些类别幻灯片的块 但是 我通过引用布局文件中的左列 在所有页面中显示了幻灯片放映块 我们需要幻灯片仅出现在左侧的某个类别 id 225 中 到目前为止我的解决方案路线图 1 将特定类别 url 重写到我的自定义模块 控
  • Xcode 4.5 无法在模拟器或设备上运行/加载应用程序

    我在 2007 年中的 Mac Mini 上运行 OS X Lion 10 7 5 上的 Xcode 4 5 我之前遇到过这个问题 当我构建时 模拟器和实际设备都不会运行应用程序 我正在使用 Phonegap 2 1 HTML JS Jqu
  • Recharts CompedChart 从零开始 X 轴刻度

    我正在使用 ComdedChart 和 shoing 条形图和线条 通常该线应从 x 轴的 0 处开始 但是当使用组合图表时无法做到这一点 如果您在上图中观察到勾选a应该从 x 轴开始 x 轴和 y 轴开始的 0 点 但事实并非如此 这是我
  • Matlab - 多维数据的PCA分析与重构

    我有一个大型多维数据集 132 维 我是数据挖掘的初学者 我想使用 Matlab 来应用主成分分析 不过 我看到网上有很多功能解释 但我不明白它们应该如何应用 基本上 我想应用 PCA 并从我的数据中获取特征向量及其相应的特征值 在此步骤之
  • 使用 XIB 实例化视图

    我有一个按照以下指南创建的 xib 如何创建自定义 iOS 视图类并实例化它的多个副本 在 IB 中 https stackoverflow com questions 9251202 how do i create a custom io
  • 如何在R中处理hdf5文件?

    我有一个文件在hdf5格式 我知道它应该是一个矩阵 但我想在其中读取该矩阵R这样我就可以研究它 我看到有一个h5r包应该有助于解决这个问题 但我没有看到任何简单易读 理解的教程 网上有这样的教程吗 具体来说 你如何阅读hdf5这个包的对象
  • 使用 REST API 更新 JIRA 票证状态

    我可以使用 CURL 命令并方便地使用 json 数据在 JIRA 中创建票证 curl D u X POST data H Content Type application json http rest api 2 issue 我现在尝试
  • 为什么 pack 和 grid 会覆盖父窗口小部件的预定义尺寸?

    我注意到每次创建 Tkinter 小部件并在小部件实例化期间或通过设置其尺寸时配置 http effbot org tkinterbook tkinter widget configuration htm稍后添加 一旦我添加 最后这些就不会
  • 这里使用持久ID来解决什么pickle问题?

    From https docs python org 3 library pickle html persistence of external objects https docs python org 3 library pickle
  • 如何定义分层数据结构的DDD聚合根?

    我目前正在尝试将领域驱动设计原则应用于我的开发实践 我一直致力于如何为按层次结构组织的数据定义聚合根 我们以文件夹结构为例 每个文件夹可以有 0 N 个子文件夹 子文件夹 0 N 也可以有 0 N 个子文件夹 依此类推 我对文件夹及其所有直