2011-12-30 78 views
0

我重构了一个类,并定义了一个名为SiteLicenseManager的新类,它向构成我的安装站点的计算机添加和删除许可证。在DDD中,包含列表的类可以是值类型吗?

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

现在,SiteLicenseManager的值类型是?

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

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

JD

+0

向/从列表添加和删除对象不是DDD。有关于这些对象的功能需求吗?对我来说,似乎很容易打扰DDD。 – 2011-12-31 15:30:02

+0

从您的描述中,听起来像您的SiteLicenseManager可能是SiteLicense系统信息库。 – Mathias 2012-01-01 06:56:31

回答

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 */ 
} 

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

相关问题