gpt4 book ai didi

domain-driven-design - 持久引用聚合之外的非根实体

转载 作者:行者123 更新时间:2023-12-04 08:20:37 26 4
gpt4 key购买 nike

DDD 上的所有 Material 都将此指定为严格的禁止,但我最近遇到了一个令人信服的情况,可以提出不同的想法。想象一下 2 个聚合根模板和文档,其中 Template --> (1:n) TemplateParam, Document --> (1:n) ParamValue 最后 2 个根有一个引用 Document --> (n:1) 模板
给定聚合根约束 ParamValue 不应保留对 TemplateParam 的引用,只有它可以通过通过 Template 聚合根获得的 transient 引用来引用它。现在,如果我想强制执行一条规则,例如“文档的每个 ParamValue 都应引用属于其所属文档引用的模板的有效 TemplateParam”。理想情况下,在数据库级别,我会让 ParamValue 对 TemplateValue 具有 FK,如何在 DDD 范例中做到这一点??

最佳答案

聚合根的存在是有原因的。它们充当一组相关实体的单一入口点,以强制执行它们的不变量。他们确保没有任何外部对象会扰乱这些实体并可能违反它们的不变量。

但是,在您的特定情况下,即使 ParamValue 持有对 TemplateParam 的直接引用,TemplateParam 也不存在被 Document 聚合中的实体修改的风险。将修改与给定文档的参数关联的,但不会修改每个参数。

为确保是这种情况,您可以将 TemplateParam 设置为不可变值对象:

(在 C# 中)

public class TemplateParam
{
private readonly string name;

public TemplateParam(string name)
{
this.name = name;
}

public string Name
{
get { return name; }
}
}

因此,您可以将 TemplateParam 封装在 ParamValue 中,而不会因 TemplateParam 的“外部化”而破坏模板聚合的不变量之一。

从技术上讲,这可能违反了 DDD 的聚合根约束,但我认为只要您保持“外部化”实体不可变并且不修改它最初所属的对象图,它在精神上就不是这样.

关于domain-driven-design - 持久引用聚合之外的非根实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11447520/

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