2010-03-28 57 views
3

我已阅读关于聚合模式,但我对这里的东西感到困惑。该模式规定属于聚合的所有对象都应该通过聚合根来访问,而不是直接访问。聚合模式和性能问题

而且我假设他们说你应该有一个单独的Repository per Aggregate。

但我认为这给应用程序增加了明显的开销。例如,在典型的基于Web的应用程序中,如果我想获取属于聚合的对象(不是聚合根),该怎么办?我将不得不调用Repository.GetAggregateRootObject(),它加载聚合根及其所有子对象,然后遍历子对象以找到我正在寻找的对象。换句话说,我正在加载大量数据并将它们扔出去,除了我正在寻找的特定对象。

有什么我在这里失踪? PS:我知道你们中的一些人可能会建议我们可以通过延迟加载来提高性能。但这并不是我在这里要求的...聚合模式要求属于聚合的所有对象都加载在一起,所以我们可以执行业务规则。

+1

我已经在他的书“领域驱动设计”中重读了Eric Evans关于聚合的部分。看起来有些情况下某些总量可能会引用另一个总量,尽管在概念上,其中一个总量看起来更像是第一个总量的孩子。在他的书中,他谈到了一辆汽车,这是一个聚合体和一个汽车引擎,也是一个聚合体。在网络应用中它可能是一样的。如果你想获取一个特定的实体,而不需要获取它的根聚合体,那么这个实体本身就是一个聚合体。 – 2010-03-28 20:35:09

回答

0

我不确定你在哪里阅读了关于这个“聚合模式”。请发布一个链接。

它可能的一件事是我们将列表封装到另一个对象中。举个简单的例子,如果我们有一个购物车,而不是传递一个购物清单,我们使用一个购物车对象。然后在整个购物车上工作的代码(例如获得总支出)可以封装在购物车中。我不知道这是否是一个真正的模式,但谷歌发现此链接:http://perldesignpatterns.com/?AggregatePattern

当你说

我怀疑“的聚合模式要求 属于总 所有对象一起装载,因此我们可以强制执行 业务规则。“

这取决于您的业务规则。

通常模式不应该被视为一套你必须遵循的规则。作为一名开发人员,您应该认识到他们可以有效使用的地方。

在我们的购物车示例中,我们通常希望一次处理整个购物车。我们可能有商业规则,说我们的客户只能订购有限的商品 - 或者他们可以为多个商品订购折扣。所以阅读整个事情是有道理的。

如果你采取不同的例子,例如。产品。您仍然可以拥有产品存储库,但您不需要一次加载它们。您可能一次只想要一页产品。