我已经重构了我的一个类,并定义了一个名为SiteLicenseManager的新类,它为组成我的安装站点的机器添加和删除许可证。
SiteLicenseManager包含LicenseType对象列表。根据我们是否添加或删除许可证,每个对象的内容都会发生变化。
现在,SiteLicenseManager是值类型吗?
虽然SiteLicenseManager没有更改(不可变),但列表对象的内容确实发生了变化(我将它们作为值对象)。但是我注意到我确实将LicenseType对象添加到列表中,因此SiteLicenseManager实际上是可变的。
此外,我的域中只能有一个SiteLicenseManager实例。
JD
答案 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 */
}
每当您需要更改值对象时,您都可以通过创建新的更新实例来更新它。这与您描述的类似,唯一的区别是您不是更改列表而是创建更新的副本。