2011-12-30 75 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 */ 
} 

每當你需要改變你的值對象,通過創建新的更新實例更新它。這與您所描述的類似,唯一的區別是,您不必更改列表,而是創建更新的副本。

相關問題