在DDD中,包含列表的类是否可以是值类型?

时间:2011-12-30 18:39:52

标签: c# domain-driven-design

我已经重构了我的一个类,并定义了一个名为SiteLicenseManager的新类,它为组成我的安装站点的机器添加和删除许可证。

SiteLicenseManager包含LicenseType对象列表。根据我们是否添加或删除许可证,每个对象的内容都会发生变化。

现在,SiteLicenseManager是值类型吗?

虽然SiteLicenseManager没有更改(不可变),但列表对象的内容确实发生了变化(我将它们作为值对象)。但是我注意到我确实将LicenseType对象添加到列表中,因此SiteLicenseManager实际上是可变的。

此外,我的域中只能有一个SiteLicenseManager实例。

JD

1 个答案:

答案 0 :(得分:1)

您应根据其含义决定您的类是值对象还是实体。如果您无法区分安装在不同站点上的相同许可证类型,则听起来您的许可证类型集合确实是值对象。

SiteLicenseManager不是值对象的好名称。此名称表明此对象作用于其他对象。我会称之为LicenseCollection或类似的东西。

但是,将值不变的列表保存在内部是非常好的(在您的情况下为许可证类型)。但是,你应该让这些列表不可变。

相反,您的值对象类应该具有通过返回此类的新实例来添加/删除许可证的操作。

类似的东西:

class LicenseCollection {
  private readonly ReadOnlyCollection<LicenseType> types;

  LicenseCollection AddLicense(LicenseType type) {
    return new LicenseCollection(/* add new license type to your list */);
  }

  /* constructors etc */
}

每当您需要更改值对象时,您都可以通过创建新的更新实例来更新它。这与您描述的类似,唯一的区别是您不是更改列表而是创建更新的副本。