问题标签 [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.
domain-driven-design - 如何确定聚合根
我有一个工程师访问气井的应用程序。他可以通过选择 7 个特征的任意组合来查看井列表。特征依次为公司、州、县、流域、分公司、领域、运营商。应用程序启动,我需要检索公司列表。用户看到的公司是基于他们的安全凭证。我的存储库基础的聚合根/域对象是什么。我首先想到的是用户,但我从未检索过有关用户的任何信息。这些项目和其他几个属性的组合统称为井口信息。那会是我的存储库的聚合根或域对象吗?
提前致谢
domain-driven-design - DDD 是否允许列表成为聚合根?
我正在尝试了解领域驱动设计的基础知识。昨天我在一个我正在使用的项目中发现了一些代码,其中存储库返回了一个实体列表,即 List getMessages() ,其中 Message 是一个实体(有自己的 id 并且是可修改的)。现在,当阅读 DDD 中的存储库时,它们非常具体地指出存储库应该返回聚合根,并且聚合上的任何操作都应该通过调用聚合根中的方法来完成。
我想将 List 放在它自己的类中,然后返回该类。但是,在我的项目中,除了遵守 DDD 之外基本上不需要这样做,因为我们只显示消息、添加新消息或删除现有消息。我们永远不需要删除所有消息,所以我们唯一的方法是, , addMessage(...)
,getMessages()
这 基本上就是我们的域服务正在做的事情。updateMessage(...)
removeMessage(...)
有什么想法吗?在描述聚合和存储库时,DDD 的最佳实践是什么?
domain-driven-design - 聚合根引用其他聚合根
我目前正在大量使用 DDD,并且在从其他聚合根加载/操作聚合根时遇到问题。
对于模型中的每个聚合根,我也有一个存储库。存储库负责处理根的持久性操作。
假设我有两个聚合根,有一些成员(实体和值对象)。
AggregateRoot1 和 AggregateRoot2。
AggregateRoot1 有一个引用 AggregateRoot2 的实体成员。
- 当我加载 AggregateRoot1 时,我是否也应该加载 AggregateRoot2?
- AggregateRoot2 的存储库应该对此负责吗?
- 如果是这样,AggregateRoot1 中的实体是否可以调用 AggregateRoot2 的存储库进行加载?
另外,当我在 AggregateRoot1 中的实体与 AggregateRoot2 之间创建关联时,应该通过实体还是通过 AggregateRoot2 的存储库来完成?
希望我的问题有意义。
[编辑]
当前解决方案
在Twith2Sugars的帮助下,我提出了以下解决方案:
如问题中所述,聚合根可以具有引用其他根的子级。将 root2 分配给 root1 的成员之一时,root1 的存储库将负责检测此更改,并将其委托给 root2 的存储库。
这只是一个简单的例子,不包括得墨忒耳法则或其他最佳原则/实践:-)
进一步的评论表示赞赏。
domain-driven-design - 聚合与否 - 订单/订单线
关于领域驱动设计,Order 和 OrderLines 始终被视为一个聚合,其中 Order 是根。通常,一旦创建订单,就无法更改它。然而,就我而言,这是可能的。相反,每个订单都有一个状态,用于确定订单是否可以更改。
在这种情况下,Order 和 OrderLines 都是它们自己的“聚合根”吗?我需要能够更新订单行,所以我认为他们应该有自己的存储库。但我不想检索订单行,并在没有订单的情况下保留它们。所以这表明仍然存在一个聚合,其中 Order 是根,具有创建订单行的工厂方法 (Order.CreateOrderLine(quantity, text, ...)。
另一种方法是在修改订单行集合时更新 Order,然后调用 UpdateOrder(Order)。我需要某种方法来检测应该只更新集合,而不是 Order 本身(使用实体框架)。你怎么看?
domain-driven-design - 您如何使用 DDD 中的实体持久化/恢复聚合根?
基于领域驱动设计中的以下定义:解决软件核心的复杂性,
聚合是:为了数据更改而将其视为一个单元的一组关联对象。外部引用仅限于 AGGREGATE 的一个成员,指定为根。一组一致性规则适用于 AGGREGATE 的边界。
我不认为聚合根应该包含对存储库的引用。由于聚合根是唯一应该持有对其实体和聚合的引用的根,它们应该是私有的。
我的存储库如何保留和恢复这些私有数据?
编辑:
让我们以经典的 Order、OrderLines 为例。
订单是聚合根。
它的线条是实体。
由于聚合根(订单)是唯一允许保存对其实体(订单行)的引用的对象,我不明白如何从存储库中保留订单行。
fluent-nhibernate - 流利的nhibernate中的两个聚合根
问题是我有两个聚合根
聚合根是
- 项目。
- 新闻文章。
一个项目可以有一组相关的 NewsArticle。一个 NewsArticle 可以有一个相关项目的集合。
要求是:
- 用户可以从 Projects 中关联多个 NewsArticle。
- 用户可以从 NewsArticles 关联多个项目。
在数据库中。
NewsArticle --* NewsArticleProject *-- 项目。
在映射中
新闻文章侧
项目方
我也尝试过HasMany()
,但这给了我一条错误消息,抱怨我也设置了 ColumnName。
我正在努力让流利的 nHibernate 很好地融入它的映射,以便它可以满足我的要求。
我只能设法让它在一侧工作,但是当我尝试让它与另一侧一起工作时,我收到了这个错误消息。
无法弄清楚多对多属性“FeaturedNewsArticles”的另一面应该是什么。
如果有人可以帮助我提出解决方案,请提前致谢。
entity-framework-4 - 使用 Entity Framework 4.0 的存储库模式聚合和聚合根
我有一个关于使用我的数据模型实现存储库模式的问题。我在网上搜索并查看了很多帖子,但我没有找到任何可以解决我疑问的答案。基本上我们的域模型如下所示,我们有一个客户端对象,它有很多子对象,而一些子对象又会有一个子对象,并且在任何时候都不需要这些没有父对象的子对象,也不会生成在应用程序中的任何意义。
它是这样的。所以从上面的表示中我有一些聚合,根是客户端对象,所以我想在聚合根级别创建一个存储库,即客户端。我的问题是如何处理其他聚合。任何人都可以请给我一些想法。
谢谢,阿杰。
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 是否更好地支持这一点?
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 的聚合,而是另一个聚合根?
domain-driven-design - 定义边界并在聚合根之间进行通信
我可以使用一些帮助来理解我的域模型并确保我正确地接近设计。
我有一个名为 Department 的聚合根。Department 对象有几个子值类型,有助于定义“部门”的业务概念。在我的 UI 中,用户可以列出、创建、编辑和删除部门对象。
我有另一个名为 Project 的聚合根。一个项目有几个子值类型,但也与一个部门有关系,因为每个项目都由一个部门“拥有”。可以创建、编辑、删除项目等,这样做对部门没有影响,而删除部门也会删除它拥有的任何项目。
我的 UI 将根据当前用户有权访问的部门显示项目列表。他们可能能够访问多个部门。当同时显示为列表项和详细信息时,我需要在项目中显示部门徽标。
我的第一个想法是 Project 是一个聚合根,具有一个简单的 DepartmentID 属性,可用于“查找”部门。但现在我开始认为我真的只有一个总根:部门。
你怎么看?
更新
我不知道这是否是讨论的关键或改变了什么,但在阅读前几个答案后我想到了以下想法。
部门似乎有两种情况:
- 作为支持修改的独立实体。
- 作为 Project 的子项,在这种情况下包含只读数据且没有行为。
这让我认为我的模型中应该有两个“对象”,一个用于案例 #1 的聚合根和一个用于案例 #2 的值类型。我在正确的轨道上吗?