2010-12-05 23 views
1

我們正在遷移當前的C#應用​​程序以使用nHibernate。由於nHibernate提倡純粹的域驅動設計,我們可以添加業務對象作爲類的屬性,或者應該繼續使用ID。nHibernate - 類中的對象或ObjectID

讓我用一個例子來說明這一點;

採取以下現有的類。地址(和孩子)僅通過他們的ID標識。

public class Person 
{ 
    public int PersonID { get; set; } 
    public string FirstName { get; set; } 
    public string FirstName { get; set; } 
    public int AddressID { get; set; } 
    public List<int> ChildrenIDs { get; set; } 
} 

當我們轉換類使用NHibernate的,我們也想借此改變「人」類的結構,以更好地滿足了需求的機會。希望NHibernate的將採取

public class Person 
{ 
    public virtual int PersonID { get; private set; } 
    public virtual string FirstName { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual AddressObject Address { get; set; } 
    public virtual List<ChildrenObject> Children { get; set; } 
} 

我們現在存儲地址對象,反對的人兒對象的名單「引擎蓋下」所有的數據檢索服務。這對我們的業務需求來說更好,因爲我們在訪問類時擁有所有信息,並且我們可以從使用ID的方法移開,而使用基礎對象。

在這種情況下,nHibernate將持續Person.Address?它是否只會保留在Person表中爲該對象提名的唯一ID?那麼ChildrenObject呢?

回答

5

您應該使用域對象作爲屬性,例如您在第二個示例中給出的屬性。

NHibernate將堅持一個獨特的AddressObject。假設AddressObjectPerson類別具有一對多的關係,因此您應該在代表PersonsAddressObject類別中擁有類型PersonList。這種關係也應在AddressObject.hbm.xml文件中定義是這樣的:

<set name="persons" cascade="all" inverse="true" lazy="true"> 
    <key column="address_id"/> 
    <one-to-many class="Person"/> 
</set> 

而且在Person.hbm.xml這樣的:

<many-to-one name="address" 
    class="AddressObject" 
    column="address_id"/> 

另外,爲什麼有具體的兒童類?如果你的意思是兒童的字面定義,爲什麼不使用Person這個類呢?

0

有兩種基本DDD類型的感興趣對象;一個實體或一個ValueObject。你或者更準確地說是你的域,決定了哪種類型的對象是一個實體,哪一個是一個ValueObject的上下文。

如果一個對象顯然是一個實體,你應該總是讓你的生活更輕鬆,並使用某種代理id堅持它,即使id在你的對象模型中沒有意義。創建一個EntityBase類,爲您抽象出一個Id的詳細信息,並從中繼承Person和其他實體。

一個地址是有趣的,有些域是一個實體,其他域是一個ValueObject。如果你決定它是一個Value Object,那麼將它映射爲NHibernate中的一個組件。

NHibernate負責所有不幸的細節,這些細節圍繞着持久對象與內存對象完全不同的事實。

HTH,
Berryl