DDD:用户聚合根与其他聚合中几乎所有实体之间的一对多关系

2024-02-20

我有以下 DDD 场景,分为以下聚合:

User,
各位朋友(用户协会),
文件(供用户上传),
画廊(文件分组),
消息(用户通信),
群组(用户可以创建并且其他成员可以加入),
GroupMessages(发送给组中所有成员的消息),
群组论坛(群组成员可以讨论各种主题)

这就是令人困惑的地方。用户与低至群组论坛的一切都相关联。必须通过用户存储库才能访问其他聚合似乎不合逻辑,但从级联的角度来看,如果我删除用户,从技术上讲,与用户关联的记录也应该消失。

似乎我也不应该将此处存在的所有一对多关联添加到用户实体,因为从数据库中进行水合似乎很荒谬,特别是如果我尝试提取与用户关联的每条记录。组织聚合和存储库的推荐策略是什么,以及处理给定实体的大量一对多关系的正确方法是什么?


事实上,您在句子“用户与一切都相关......”中使用了“关联”一词,这是一个很好的线索。聚合根相互关联,甚至一个聚合根“属于”另一个聚合根,这绝对是好事。但是,您需要考虑一个实体是否可以在没有 AR 的情况下存在。如果可以的话,它可能有自己的生命周期,并且应该是 AR。如果不能,它就是聚合的一部分。这可能很难提炼。

您需要在 AR 周围有一个非常清晰的边界。例如,即使论坛可能需要用户创建它,但这并不意味着在删除用户时需要(甚至可以)删除论坛。因此,论坛中的用户可能会成为,比如说ForumCreator(值对象)仅包含用户名和 ID。当用户被删除后,论坛可以继续存在。

在订单/订单行/产品场景中,如果您选择删除包含特定产品的所有订单行,则删除它没有多大意义。我知道某个产品可能永远不应该被删除,但我们将使用它作为示例。您只需将相关产品数据“非规范化”到订单行中,例如:产品 ID、产品名称。因此,即使产品名称发生更改,也不意味着所有订单行都需要更新,甚至应该更新。事实上,订单行代表一个时间点,“原始”产品名称应保留。购买者可能订购了“Some liril 产品”,然后名称更改为“Little 产品”。尽管它是完全相同的产品,但不是同一件事。购买者只记得原件。

我希望这是有道理的,并能在某种程度上有所帮助。您肯定需要找到对象图的硬边才能获得真正的聚合。

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

DDD:用户聚合根与其他聚合中几乎所有实体之间的一对多关系 的相关文章

  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • Rx.NET 中是否有一个Subject 实现,其功能类似于BehaviourSubject,但仅在值发生更改时才发出?

    有没有Subject https learn microsoft com en us previous versions dotnet reactive extensions hh229699 v vs 103 Rx NET 中的实现在功能
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 前向声明类型和“已声明为类类型的非类类型”

    我对以下代码有问题 template
  • 现代 C++ 编译器是否能够在某些情况下避免调用 const 函数两次?

    例如 如果我有以下代码 class SomeDataProcessor public bool calc const SomeData d1 const SomeData d2 const private Some non mutable
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我

随机推荐