问题标签 [aggregateroot]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
214 浏览

domain-driven-design - 领域驱动设计聚合

有人可以澄清以下内容吗?

如果有以下型号;

演示文稿-->幻灯片-->视频

我已将演示文稿标识为聚合根,这是否意味着如果我想将幻灯片添加到演示文稿中,那么我必须通过聚合根,例如presentation.addslide(slide myslide),如果我想添加类似的方式幻灯片的视频我还必须通过聚合根,例如presentation.addvideotoslide(video myvideo,int slideNumber)?

或者我可以在演示文稿之外使用幻灯片并在幻灯片上有一个方法,例如 slide.addvideo(video myvideo)?

谢谢

0 投票
1 回答
362 浏览

c# - 如何通过 NHibernate 处理聚合根中的持久计算属性的并发性?

我需要使用聚合根来持久化计算属性。计算基于子实体。我正在使用根通过域方法添加/删除子项,这些方法会更新计算属性。

系统的多个用户可以将子实体添加到特定根。例如,UserA 可以向 Root123 添加一个孩子,而 UserB 也可以向 Root123 添加一个孩子。

当多个用户可能在不同事务中将子实体添加到同一根目录时,如何确保此计算属性准确持久?在我的特殊情况下,计算属性用于确保不超过某些限制,如根上的另一个属性设置的那样。


这是该问题的更具体示例:

如果 2 个用户大致同时提交他们的提案怎么办?UI 发现尚未达到限制,并显示网页以向两个用户提交提案。当第一个用户提交时,一切都很好。现在,只要第一个用户在第二个用户之前提交,第二个用户就可以了,这样当第二个用户提交时,从数据库中检索数据并且限制是准确的。

这是一个有争议的问题吗?对于 2 个用户几乎同时提交的罕见情况,我是否应该依赖数据库中的约束(ProposalLimit >= ProposalCount)?

0 投票
1 回答
565 浏览

domain-driven-design - 访问子类聚合成员

我知道我们不应该直接更改聚合根的子节点,而应该通过聚合根上的方法来执行它们。例如order.SetOrderLineQty(product, qty);

但是如果聚合根的孩子是抽象的呢?假设您有 Car 聚合根,其中包含 IWheel 列表作为聚合的一部分。您将如何通过其聚合根添加/更改轮子的属性(谁对它们可能是什么具体类型的轮子一无所知)?

一个更真实的例子是:医生可以创建一个 MedicalRerport(聚合根),其中包含一个 IMedicalNote 列表(作为 MedicalReport 聚合的一部分)。IMedicalNote 是一个基类/接口,它被细分为几个具体的子类,例如 BloodCheckNote、TemperatureNote、MineralConcentrationNote 等。

每个子类都有不同的属性,它们都是可编辑的。MedicalReport 聚合可能包含一个或多个这些注释中的任何一个。(每个注释子类都有一个特定的用户控件供用户输入/更新详细信息,在 MedicalReport 大屏幕下显示为面板/选项卡)

我的问题是,如何严格通过其聚合根(MedicalReport)添加/编辑这些注释的属性?由于我不允许直接更改这些注释属性,一个丑陋的选择是在聚合根 (MedicalReport) 上公开所有可能的注释属性,即:

这些方法中的每一个都将在其内部子集合中更新(或创建新)便笺项。这有两个明显的问题:

  1. 我们必须预先定义聚合根上所有可能的 IMedicalNote 子类的所有可用属性。这是不可接受的,因为子类的数量肯定会增长,这取决于我们想要捕获的医疗数据的类型,这首先是继承的重点。
  2. 列表中可以有多个相同笔记类型的实例。这个 API 会失败,因为我们不能说report.SetBloodCheckComment(comment)并期望它会更新列表中的 BloodCheckNote 项目,因为我们允许列表中有多个 BloodCheckNote 项目。

我仍然想通过它的聚合根来维护与这些注释的所有交互,因为它必须控制整个 MedicalReport 聚合是否有效以保存、聚合是否不可修改、粗粒度的乐观并发检查等。但是我怎样才能做到这一点?

0 投票
3 回答
2401 浏览

domain-driven-design - DDD - 我怎样才能避免在这里跨越聚合边界?

我们正在开发一个新项目(重写现有应用程序),并且我的域模型/存储库设计遇到了问题。

这是我们领域模型中两个关键部分的(简化)版本:

替代文字

如您所见,我有一个Post的抽象概念,可以是评论、讨论、照片、视频等。帖子也可以有评论。

我还有一个Location的抽象概念,显然是 Streets、Cities、Neighbourhoods 等。

现在,这在我看来自然是两个清晰的总根。

所以我创建了两个存储库,一个名为PostRepository,另一个名为LocationRepository

这一切正常,我可以添加/获取任何类型的帖子(或评论),并通过这两个存储库之一添加/获取任何类型的位置。

但是现在我处于一个城市的“登陆页面”的场景中(例如)。

在此页面上,我基本上需要显示“此位置的所有帖子”。

那是怎么定义的?好吧,可以(可选地)在某个位置标记帖子。实现细节,所以我不想深入研究数据(因为这不是 DDD 的内容),但本质上是地理空间智能可以通过位置的形状文件来确定特定位置包含哪些帖子,以及标记的帖子的纬度/经度。

但是我怎样才能在不跨越边界的情况下检索这些信息呢?

我使用哪个存储库?我需要一个新的吗?

如果它很重要(或出于好奇),这是一个带有 SQL Server 2008 数据库和 Entity Framework 4.0 的 Web 应用程序 (ASP.NET MVC)。

如果您需要任何澄清,请告诉我。

编辑

我们目前使用规范模式的修改版本来检索域模型。

例如,这是我们 BLL 中用于检索所有评分 >= 4 的评论的代码:

但现在我需要一些这样的代码:

问题是我不知道如何在不添加中间连接实体(LocationPost - 因为它是多对多的)的情况下执行上述查询,并将 FK 添加到 Post 域模型。

但是通过这样做,我跨越了总体界限——不是吗?

0 投票
2 回答
261 浏览

domain-driven-design - 聚合根设计和表示层

我想知道我的表示层的结构是否可以引导我设计聚合根。

让我们有一个实体 ProjectEntity 及其相关实体 ProjectMemberEntity (1:M)

页面结构如下:

页面顶部是 ProjectEntity 的表单

表单下方是一个显示 ProjectMemberEntity 列表的网格。

如果要添加新的 ProjectMember,用户必须转到此页面并单击位于网格标题中的“添加新成员”按钮。编辑和删除具有相同的类比。

我想知道这种行为/“页面结构”是否可能是聚合根(项目实体)的提示

0 投票
1 回答
230 浏览

domain-driven-design - 在这种情况下,聚合根是什么

我有这些实体

  • 用户
  • 任务 - 每个任务都必须分配一个用户
  • 项目 - 可以将任务分配给项目,但这不是必需的,用户必须被分配为项目创建者
  • TaskStatus - 每个任务都必须分配一个状态

我设计了聚合根如下

聚合根

  • 具有实体的用户:任务、任务状态
  • 项目

我是否朝着正确的方向前进?

0 投票
1 回答
276 浏览

domain-driven-design - 放置域逻辑以更新聚合根的子级的合适位置在哪里?

直接更新聚合根的子节点是最佳做法,还是仅通过其聚合根更新?例如,这是首选:

或者

本部门的任何指导将不胜感激。

0 投票
1 回答
638 浏览

domain-driven-design - 将子实体添加到聚合根的推荐方法是什么?

哪种方法更好,首先创建子实体,然后传递给聚合根以添加它们,还是让聚合根创建它们?例如:

或者

哪种方法更好?我敢肯定这纯粹是主观的,但我想看看哪个有更多的利弊。

0 投票
1 回答
1353 浏览

domain-driven-design - 如何从关系模型中定义聚合根以便将其用于 DDD?

我已经看了相当长一段时间的其他帖子,相对于聚合根。似乎我根本不明白如何以正确的方式定义聚合根。我看到诸如聚合根之类的答案可能不是聚合根,反之亦然。我有点困惑。问题是我脑子里有关系模型,但我知道 DDD 不会那样做。

有没有办法从关系模型中定义聚合根?

例如,如果您有一个包含日记条目的日记,每个日记条目都包含任务、问题和注释

您将如何定义聚合根?根是期刊吗?但如果您想访问笔记、问题和任务,这可能会导致问题。那么这些也聚合了引用日记帐条目的根吗?

它的东西很难理解,我想有更多的澄清。

谢谢。

0 投票
3 回答
606 浏览

domain-driven-design - 访问不是聚合根的实体

我在看 DDD,我有一些想法。在一个购物网站上,我有典型的订单。

付款似乎很自然地放在订单上。下订单或处理订单时,付款是订单的一部分。

但后来管理员想单独处理付款。例如,在管理界面中有需要处理的付款列表。

我该怎么做?Payments 是否应该从订单中删除并成为其自己的根聚合?