问题标签 [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 回答
459 浏览

domain-driven-design - 如何确定聚合根

我有一个工程师访问气井的应用程序。他可以通过选择 7 个特征的任意组合来查看井列表。特征依次为公​​司、州、县、流域、分公司、领域、运营商。应用程序启动,我需要检索公司列表。用户看到的公司是基于他们的安全凭证。我的存储库基础的聚合根/域对象是什么。我首先想到的是用户,但我从未检索过有关用户的任何信息。这些项目和其他几个属性的组合统称为井口信息。那会是我的存储库的聚合根或域对象吗?

提前致谢

0 投票
1 回答
1590 浏览

domain-driven-design - DDD 是否允许列表成为聚合根?

我正在尝试了解领域驱动设计的基础知识。昨天我在一个我正在使用的项目中发现了一些代码,其中存储库返回了一个实体列表,即 List getMessages() ,其中 Message 是一个实体(有自己的 id 并且是可修改的)。现在,当阅读 DDD 中的存储库时,它们非常具体地指出存储库应该返回聚合根,并且聚合上的任何操作都应该通过调用聚合根中的方法来完成。

我想将 List 放在它自己的类中,然后返回该类。但是,在我的项目中,除了遵守 DDD 之外基本上不需要这样做,因为我们只显示消息、添加新消息或删除现有消息。我们永远不需要删除所有消息,所以我们唯一的方法是, , addMessage(...),getMessages()这 基本上就是我们的域服务正在做的事情。updateMessage(...)removeMessage(...)

有什么想法吗?在描述聚合和存储库时,DDD 的最佳实践是什么?

0 投票
3 回答
12203 浏览

domain-driven-design - 聚合根引用其他聚合根

我目前正在大量使用 DDD,并且在从其他聚合根加载/操作聚合根时遇到问题。

对于模型中的每个聚合根,我也有一个存储库。存储库负责处理根的持久性操作。

假设我有两个聚合根,有一些成员(实体和值对象)。

AggregateRoot1 和 AggregateRoot2。

AggregateRoot1 有一个引用 AggregateRoot2 的实体成员。

  1. 当我加载 AggregateRoot1 时,我是否也应该加载 AggregateRoot2?
  2. AggregateRoot2 的存储库应该对此负责吗?
  3. 如果是这样,AggregateRoot1 中的实体是否可以调用 AggregateRoot2 的存储库进行加载?

另外,当我在 AggregateRoot1 中的实体与 AggregateRoot2 之间创建关联时,应该通过实体还是通过 AggregateRoot2 的存储库来完成?

希望我的问题有意义。

[编辑]

当前解决方案

Twith2Sugars的帮助下,我提出了以下解决方案:

如问题中所述,聚合根可以具有引用其他根的子级。将 root2 分配给 root1 的成员之一时,root1 的存储库将负责检测此更改,并将其委托给 root2 的存储库。

这只是一个简单的例子,不包括得墨忒耳法则或其他最佳原则/实践:-)

进一步的评论表示赞赏。

0 投票
1 回答
1689 浏览

domain-driven-design - 聚合与否 - 订单/订单线

关于领域驱动设计,Order 和 OrderLines 始终被视为一个聚合,其中 Order 是根。通常,一旦创建订单,就无法更改它。然而,就我而言,这是可能的。相反,每个订单都有一个状态,用于确定订单是否可以更改。

在这种情况下,Order 和 OrderLines 都是它们自己的“聚合根”吗?我需要能够更新订单行,所以我认为他们应该有自己的存储库。但我不想检索订单行,并在没有订单的情况下保留它们。所以这表明仍然存在一个聚合,其中 Order 是根,具有创建订单行的工厂方法 (Order.CreateOrderLine(quantity, text, ...)。

另一种方法是在修改订单行集合时更新 Order,然后调用 UpdateOrder(Order)。我需要某种方法来检测应该只更新集合,而不是 Order 本身(使用实体框架)。你怎么看?

0 投票
2 回答
4234 浏览

domain-driven-design - 您如何使用 DDD 中的实体持久化/恢复聚合根?

基于领域驱动设计中的以下定义:解决软件核心的复杂性,

聚合是:为了数据更改而将其视为一个单元的一组关联对象。外部引用仅限于 AGGREGATE 的一个成员,指定为根。一组一致性规则适用于 AGGREGATE 的边界。

我不认为聚合根应该包含对存储库的引用。由于聚合根是唯一应该持有对其实体和聚合的引用的根,它们应该是私有的。

我的存储库如何保留和恢复这些私有数据?


编辑:

让我们以经典的 Order、OrderLines 为例。

订单是聚合根。

它的线条是实体。

由于聚合根(订单)是唯一允许保存对其实体(订单行)的引用的对象,我不明白如何从存储库中保留订单行。

0 投票
1 回答
253 浏览

fluent-nhibernate - 流利的nhibernate中的两个聚合根

问题是我有两个聚合根

聚合根是

  1. 项目。
  2. 新闻文章。

一个项目可以有一组相关的 NewsArticle。一个 NewsArticle 可以有一个相关项目的集合。


要求是:

  1. 用户可以从 Projects 中关联多个 NewsArticle。
  2. 用户可以从 NewsArticles 关联多个项目。

在数据库中。

NewsArticle --* NewsArticleProject *-- 项目。


在映射中

新闻文章侧

项目方

我也尝试过HasMany(),但这给了我一条错误消息,抱怨我也设置了 ColumnName。


我正在努力让流利的 nHibernate 很好地融入它的映射,以便它可以满足我的要求。

我只能设法让它在一侧工作,但是当我尝试让它与另一侧一起工作时,我收到了这个错误消息。

无法弄清楚多对多属性“FeaturedNewsArticles”的另一面应该是什么。

如果有人可以帮助我提出解决方案,请提前致谢。

0 投票
1 回答
1209 浏览

entity-framework-4 - 使用 Entity Framework 4.0 的存储库模式聚合和聚合根

我有一个关于使用我的数据模型实现存储库模式的问题。我在网上搜索并查看了很多帖子,但我没有找到任何可以解决我疑问的答案。基本上我们的域模型如下所示,我们有一个客户端对象,它有很多子对象,而一些子对象又会有一个子对象,并且在任何时候都不需要这些没有父对象的子对象,也不会生成在应用程序中的任何意义。

它是这样的。所以从上面的表示中我有一些聚合,根是客户端对象,所以我想在聚合根级别创建一个存储库,即客户端。我的问题是如何处理其他聚合。任何人都可以请给我一些想法。

谢谢,阿杰。

0 投票
1 回答
606 浏览

entity-framework-4 - 使用 Entity Framework 4 聚合根到子实体导航

我正在尝试将聚合根模式应用于我的域。我正在使用带有 POCO 实体生成器的实体框架 4。

我有两个实体: MailingTask EmailLog 具有一对多的关系。(MailingTask 有很多 EmailLogs)。EF4 在 MailingTask 上生成一个导航属性:

在我的模型中,我永远不想直接访问 EmailLogs,总是通过其父 MailingTask。这是通过以下方式强制执行的:

  • 只有一个 MailingTask 存储库,所以我不能直接查询 EmailLogs 表。
  • 仅通过此导航属性获取 EmailLogs。

我有时需要计算 MailingTask 的 EmailLogs 数量。这是通过在导航属性上使用 LINQ 来实现的:

但这在应用程序端(而不是数据库服务器)执行。(而且它非常昂贵,因为我有很多用于 MailingTask 的 EmailLogs。)我阅读了一些关于这种行为的帖子,似乎 EF4 导航属性不能用作 IQueryable(在数据库端执行)。当您访问导航属性时,EF4 会在内存中加载所有包含所有列的条目,并在内存中应用 LINQ 表达式。对于 Count() 语句,这很痛苦。

我相信我将不得不改变我的模型以适应这种专门的查询(可能添加一个具有查询能力的 EmailLogsRepository)。对我来说,似乎 EF4 不能很好地支持聚合根模式。或者我可能遗漏了一些关于聚合根模式以及它应该如何在 EF4 方面实现的内容......

有没有人遇到过这种情况并能够解决这个问题?nHibernate 或其他 ORM 是否更好地支持这一点?

0 投票
2 回答
255 浏览

asp.net-mvc - ASP.NET MVC Action 方法如何访问聚合根的子实体?

我无法理解如何访问聚合根的子实体。从我上一个问题的答案中,我现在了解到我需要识别模型的聚合根,然后只设置处理这些根对象的存储库。

所以说我有一个包含项目的订单对象。项目必须存在于和 Order 中,因此 Order 是聚合根。但是,如果我想在我的网站中包含一个 OrderItem 详细信息页面怎么办?此页面的 URL 可能类似于 /Order/ItemDetails/1234,其中 1234 是 OrderItem 的 ID。然而,这需要我直接按 ID 检索项目,并且因为它不是聚合根,所以我不应该有一个可以按 ID 检索 OrderItem 的 OrderItemRepository。

由于我想使用独立于 Orders 的 OrderItems,这是否意味着 OrderItem 实际上不是 Order 的聚合,而是另一个聚合根?

0 投票
3 回答
1526 浏览

domain-driven-design - 定义边界并在聚合根之间进行通信

我可以使用一些帮助来理解我的域模型并确保我正确地接近设计。

我有一个名为 Department 的聚合根。Department 对象有几个子值类型,有助于定义“部门”的业务概念。在我的 UI 中,用户可以列出、创建、编辑和删除部门对象。

我有另一个名为 Project 的聚合根。一个项目有几个子值类型,但也与一个部门有关系,因为每个项目都由一个部门“拥有”。可以创建、编辑、删除项目等,这样做对部门没有影响,而删除部门也会删除它拥有的任何项目。

我的 UI 将根据当前用户有权访问的部门显示项目列表。他们可能能够访问多个部门。当同时显示为列表项和详细信息时,我需要在项目中显示部门徽标。

我的第一个想法是 Project 是一个聚合根,具有一个简单的 DepartmentID 属性,可用于“查找”部门。但现在我开始认为我真的只有一个总根:部门。

你怎么看?

更新

我不知道这是否是讨论的关键或改变了什么,但在阅读前几个答案后我想到了以下想法。

部门似乎有两种情况:

  1. 作为支持修改的独立实体。
  2. 作为 Project 的子项,在这种情况下包含只读数据且没有行为。

这让我认为我的模型中应该有两个“对象”,一个用于案例 #1 的聚合根和一个用于案例 #2 的值类型。我在正确的轨道上吗?