我应该避免使用聚合根吗?

时间:2013-08-05 08:04:34

标签: c# nhibernate domain-driven-design

问题

有四个实体:

class Product : Entity<Product> {
    public virtual String Title { get; set; }
    public virtual Category Category { get; set; }
    public virtual Vendor Vendor { get; set; }
}

class Category : Entity<Category> { /* properties */ }
class Vendor : Entity<Vendor> { /* properties */ }

这四个都没有定义为组件,我不知道应该使用哪一个(用IAggregateRoot接口标记)作为聚合根。

我需要轻松访问供应商类别的列表,以便在创建新产品时在页面上显示它们。

然后根据这些实体显示应该有三个Repository个实例。

ASIDE

我见过几个大型项目。他们大量使用Vendor,State,TechnicalOptions等独立实体的列表。我认为设计具有聚合根的东西是合乎逻辑的,但我不知道DDD原则是否适用于那里。

2 个答案:

答案 0 :(得分:7)

它们看起来像不同的聚合,可以通过应用级联删除的规则来确认:

级联删除规则有时被认为是判断您是否有一组实体或VO应该是聚合的好方法 - 如果父项被删除,则下面该聚合的所有其他部分都将被删除太。 因此,如果被删除的父项也删除所有子项没有意义,那么你没有聚合,你只需要一个老式的参考。

在您的情况下,如果产品被删除,您不希望级联删除所有相关类别,因为它们可能与其他产品相关(您可以将此规则应用于其他实体)。所以你可能每个都有一个存储库

答案 1 :(得分:0)

您不应该有一个AR引用另一个的实例。而是通过ID引用或使用值对象。

然后尝试不查询您的域模型,因为这会导致一些懒惰的提货和其他讨厌的设计。而是创建一个瘦查询层来返回所需的数据。您甚至可能希望对查询层的某些数据进行非规范化,以提高性能。