问题
有四个实体:
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原则是否适用于那里。
答案 0 :(得分:7)
它们看起来像不同的聚合,可以通过应用级联删除的规则来确认:
级联删除规则有时被认为是判断您是否有一组实体或VO应该是聚合的好方法 - 如果父项被删除,则下面该聚合的所有其他部分都将被删除太。 因此,如果被删除的父项也删除所有子项没有意义,那么你没有聚合,你只需要一个老式的参考。
在您的情况下,如果产品被删除,您不希望级联删除所有相关类别,因为它们可能与其他产品相关(您可以将此规则应用于其他实体)。所以你可能每个都有一个存储库
答案 1 :(得分:0)
您不应该有一个AR引用另一个的实例。而是通过ID引用或使用值对象。
然后尝试不查询您的域模型,因为这会导致一些懒惰的提货和其他讨厌的设计。而是创建一个瘦查询层来返回所需的数据。您甚至可能希望对查询层的某些数据进行非规范化,以提高性能。