2010-12-05 4 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; } 
} 

我々は今、Addressオブジェクトと人に対する子どものオブジェクトのリストを格納する「ボンネットの下に」すべてのデータの検索の世話をすることを期待。これは、クラスにアクセスする際にすべての情報を持っているため、私たちのビジネスニーズに適しています。IDを使用するのではなく、基礎となるオブジェクトを使用することから離れることができます。

このシナリオでは、nHibernateはPerson.Addressに対して何を保持しますか?それは、Personテーブル内のそのオブジェクトにノミネートされた一意のIDだけを保持しますか? ChildrenObjectはどうですか?

答えて

5

ドメインオブジェクトは、2番目の例のようにプロパティとして使用する必要があります。

NHibernateはユニークなAddressObjectを保持します。 AddressObjectはおそらくPersonクラスと1対多の関係になるため、クラスにタイプのPersonがあり、そこに住んでいるのはPersonsです。この関係はまた、このようなあなたの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

目的のオブジェクトには2つの基本的なDDDタイプがあります。エンティティまたはValueObjectドメイン、より正確には、どのタイプのオブジェクトがエンティティであり、どれがValueObjectであるかを示すコンテキストを決定します。

オブジェクトが明らかにエンティティである場合、は常にになります。idがオブジェクトモデル内で意味を持たないにもかかわらず、サロゲートIDを使用して永続化します。あなたのIDの詳細を抽象化し、そこからPersonや他のエンティティを継承するEntityBaseソートクラスを作成します。

アドレスはEntityなどの一部のドメインでは面白いですが、ValueObjectということもあります。それがバリューオブジェクトであると判断した場合、それをNHibernateのコンポーネントとしてマップします。

NHibernateは、永続化されたオブジェクトがメモリ内のオブジェクトとはまったく異なるという事実を取り巻く、不幸な詳細すべてを処理します。

HTH、
ベリル