我应该避免使用聚合根吗

本文关键字:我应该 | 更新日期: 2023-09-27 18:26:30

问题

有四个实体:

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

我看过几个大型项目。他们大量使用独立实体的列表,如供应商、国家、技术选项。我认为用聚合根设计东西是合乎逻辑的,但我不知道DDD原则在那里是否合适。

我应该避免使用聚合根吗

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

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

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

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

然后尽量不要查询你的域模型,因为这会导致一些懒惰的提货和其他令人讨厌的设计。相反,创建一个精简查询层来返回所需的数据。您甚至可能希望取消查询层的某些数据的规范化,以提高性能。