问题标签 [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 投票
3 回答
8952 浏览

nhibernate - 使用 ActiveRecord 在 nHibernate 中急切加载延迟加载的实体

我正在开发一个项目,该项目具有丰富的对象模型和各种聚合根集。

我们正在使用Castle堆栈(通过 ActiveRecord 到 nHibernate 的 Monorail)。

我们已将聚合根标记为惰性[ActiveRecord(Lazy = true)],并在我们的存储库上自定义了“渴望”例程以渴望获取对象图。我们使用 HQL 从我们的根的子集合中定义渴望获取,

例如,如果Account是聚合根(并标记为延迟加载),我们将急切地获取Account .. Order .. Product实体以获得完整的图形。

所以到目前为止没有任何意外(希望如此)。

现在,如果在上面的示例中, Product 也被标记[ActiveRecord(Lazy = true)],这似乎停止了 HQL 中的 Eager fetch 指令。

有谁知道强制急切获取延迟加载的子对象的方法

干杯伊恩

更新

好的,这里有一些示例 hql,使用下面 'me.yahoo.com/../1' 中的示例,我们在获取多对多关系时使用 IMuliQuery 来解决 N+1 依赖关系。我们还明确地使用了多对多映射类。因此,我们的 hql 是:

...所以这会执行 2 条 sql 语句并返回所需的最小行集,我们可以将其解析为单个对象图。好的。

但是...如果,比如说,Address被标记为延迟加载(并且Order没有),访问Order不会触发进一步的 sql 语句,但访问Address会触发,尽管事实上两者都是急切加载的。

那么为什么上面的延迟加载的实体没有Address被上面的语句急切地获取呢?

0 投票
1 回答
158 浏览

nhibernate - NHibernate - 从聚合根向下钻取

给定一个聚合根 X,它有很多 Y,Y 有很多 Z...

如何深入了解关联并仅选择 Z 具有特定属性值的那些 X?

IList Xs = Session.CreateCriteria(typeof(X)) .CreateAlias("Ys", "Y") .CreateAlias("Y.Zs", "Z") .Add(Expression.Eq("Z.Property", 1 )) 。列表();

这样做会导致 PropertyAccessException,我不知道为什么。

加载所有 X 并测试它们的 Z 属性将是非常多余的。

0 投票
1 回答
1101 浏览

entity-framework - 使用实体框架急切加载聚合根

我想创建一种更结构化的方法来加载所需的实体树:

我需要大量数据,所以我使用类型安全的包含(只是一个普通的包含,但使用 Lambda)来执行此操作,如此处所示

正如我所说,我需要大量数据,基本上是一个父项下的整个实体树。

现在,我可以这样做:

如您所见,这条充满包含的行会变得非常庞大。这实际上是实际代码的一个非常简化的示例(顺便说一句,不包括房屋)

所以我想做的是创建方法,负责它在树中的分支。该方法可以接受对象查询并包含子对象,然后调用“子加载器方法”。此外,父母应该无关紧要,只要它具有与孩子的类型的属性。

这可能没有多大意义,所以:

等等。但我无法真正理解它......传入查询和调用子方法之间缺少链接。

有没有人做过这样的事情?或者有人可以给我一些指示吗?

0 投票
3 回答
4690 浏览

domain-driven-design - DDD:聚合根问题

假设我有 2 个实体 - Foo 和 Bar。Foo 是聚合根并包含 Bar。据我了解,它应该是这样的:

我想为用户提供从定义的列表中选择 Bars for Foos 的功能(并更改它)。

如果存储库应该仅用于聚合根,则意味着将没有 Bar 实体的存储库。

这会导致问题 - 如果没有对 Foo 的引用,就无法独立创建/更新 Bar。

这是否意味着 Bar 应该有一个存储库,尽管没有 Foo 就没有意义?

0 投票
5 回答
1163 浏览

nhibernate - DDD/NHibernate 使用聚合根和对网页设计的影响 - 例如。编辑聚合根的子节点

希望这个虚构的例子能说明我的问题:

假设您正在编写一个系统来跟踪软件产品的投诉以及有关该产品的许多其他属性。在这种情况下,SoftwareProduct 是我们的聚合根,而 Complaints 是只能作为产品子项存在的实体。换句话说,如果软件产品从系统中删除,那么投诉也应如此。

在系统中,有一个类似网页的仪表板,显示单个软件产品的许多不同方面。仪表板中的一个部分以类似网格的方式显示投诉列表,仅显示每个投诉的一些非常高级的信息。当管理员类型的用户选择其中一个投诉时,他们会被引导到一个编辑屏幕,允许他们编辑单个投诉的详细信息。

问题是:编辑屏幕检索单个投诉的最佳方式是什么,以便可以显示以进行编辑?请记住,我们已经将 SoftwareProduct 建立为聚合根,因此不应允许直接访问投诉。此外,系统正在使用 NHibernate,因此可以选择急切加载,但我的理解是,即使通过 SoftwareProduct 急切加载单个投诉,只要访问投诉集合,就会加载集合的其余部分。那么,如何通过 SoftwareProduct 获得单个投诉,而不会产生加载整个投诉集合的开销?

0 投票
11 回答
150990 浏览

design-patterns - 什么是聚合根?

我试图弄清楚如何正确使用存储库模式。聚合根的核心概念不断出现。在搜索 Web 和 Stack Overflow 以寻求有关聚合根是什么的帮助时,我一直在寻找关于它们的讨论以及指向应该包含基本定义的页面的死链接。

在存储库模式的上下文中,什么是聚合根?

0 投票
2 回答
3236 浏览

unit-testing - 单元测试领域对象

当用户在事件页面上输入他们的电子邮件地址时,我们需要添加事件提醒。事件是另一个域对象。我们最初的想法是创建一个 Customer 域对象和相关的 CustomerService:

我们如何在单元测试中验证 AddEmailReminder 方法确实被新客户调用了?

我的想法:

  1. 使用工厂来创造客户。这闻起来很臭,因为我认为您只应该在对象创建有一些复杂性的情况下使用工厂。
  2. 错误的代码。也许有更好的方法来做到这一点?
  3. 起订量魔法。

在单独的注释中(也许它是相关的),我们如何确定这里的聚合根?我们已经武断地决定了客户是,但它同样可能是事件。我已阅读并理解有关聚合根的文章,但在这种情况下尚不清楚。

0 投票
1 回答
765 浏览

repository - 应该如何表达向存储库添加聚合根?

假设我们有一个 Order 类型的聚合根实体,它将客户和订单行关联起来。当我考虑订单实体时,更自然地将其概念化为没有 ID 就没有定义。没有 Id 的订单似乎比订单更好地表示为订单请求。

要将订单添加到存储库,我通常会看到人们在没有 ID 的情况下实例化订单,然后让存储库完成对象:

我喜欢这种方法的地方在于,您正在向 OrderRepository 添加一个 Order 实例。这很有意义。但是,订单实例没有 Id,并且在存储库的消费者范围内,订单没有 Id 对我来说仍然没有意义。我可以将 OrderRequest 定义为 order 的实例并将其添加到存储库中,但这感觉就像从橙子中派生出一个苹果,然后将其添加到橙子列表中。

或者,我也看到了这种方法:

我喜欢这种方法的地方在于,没有 ID 的订单是未定义的。存储库可以在创建和返回订单实例之前创建数据库记录并收集所有必需的字段。这里闻起来的事实是,您实际上从未将订单实例添加到存储库中。

无论哪种方式都有效,所以我的问题是:我是否必须接受这两种解释中的一种,或者是否有最佳实践来模拟插入?

我发现这个答案是相似的,但对于值对象: 我应该如何将对象添加到由聚合根维护的集合中。当涉及到一个值对象时,没有混淆,但我的问题涉及一个具有从外部源(自动生成的数据库 ID)派生的身份的实体。

0 投票
3 回答
1451 浏览

c# - 聚合根。兔子洞能走多远

我正在尝试为我当前的项目使用存储库模式,并且我目前正在尝试对域进行建模并找到聚合根。

我读过“级联删除”规则,该规则指出,如果在删除根目录时删除成员没有意义,那么它不应该是根目录的一部分。

我将以警察事件为例:-

事件(总根)- 这可能包含调查人员、每个人员所做的记录。它还可能包含带有接受采访日期列表的嫌疑人。是否获得了事件的闭路电视录像?每次观看 CCTV 的日志以及由谁观看?是否复制了中央电视台的证据/法庭等

看起来 IncidentAggregate 可能会变得巨大,因为似乎一切都取决于该事件。

我的问题是双重的,聚合根应该管理多少,根中的根是一个好主意吗?

这可能不是一个特别好的例子,因为你可能永远不会删除像警察事件这样的东西,但我希望它更好地描述了我的问题。

0 投票
1 回答
5404 浏览

domain-driven-design - 处理 DDD 中的嵌套聚合

我刚刚开始使用 DDD,在弄清楚如何适应数据的关系性质时遇到了一些麻烦。我有我认为会被认为是我的聚合根的东西,但聚合也有它自己的聚合。不想违反得墨忒耳法则,我想知道我是否在想这个错误,并希望一些 DDD 专家可以提供一些见解。

我的聚合根是我的Account对象,它具有众多AccountElement实体的聚合,这些实体本身就是各个ProductComponent实体的逻辑分组。

anAccountElement的上下文之外Account没有任何意义,因此我对我的结论感到满意,即该Account对象是我的聚合根,并且我预计该实体具有聚合Elements属性。ProductComponent让我困惑的是这个系列。这个聚合在 a 之外没有任何意义,在 a 之外AccountElement真的没有任何意义Account

我认为我不应该ProductComponent通过点我的方式来访问单个对象,例如:

ProductComponent但与此同时,直接从Account实体访问 a 是没有意义的(从域的角度来看) 。

我敢肯定,如果不了解我的领域,这一切有点难以理解,但我希望这足以获得一些好的反馈。