2012-01-18 8 views
0

NHを通してロードするときは、デフォルトのコンストラクタが使用され、マップのすべてのプロパティが設定されます。それは私によっては大丈夫です。NHibernateと欠落しているコンストラクタコード

しかし、コンストラクタにロジックがあるとどうなりますか? NH建設後に呼び出されるメソッドを登録できますか?

(それはもっと複雑になり、いくつかのプロパティを含む可能性があります)

public class Person 
{ 
    string name; 
    int? age; 
    DateTime ageStamp; 

    public Person(string name, int? age) 
    { 
     this.name = name; 
     if (age!=null) 
     { 
      this.age = age; 
      ageStamp = DateTime.Now; 
     } 
    } 
} 
+0

は、あなたが何をしたいのための擬似コードを表示します。 – gdoron

+0

が例を追加しましたが、もっと複雑になり、いくつかのプロパティが含まれます。 – Stig

+0

'AutoMapper'を使用できます。 – gdoron

答えて

1

プライベートデフォルトコンストラクタを作成できます。

NHibernateは、データベースからエンティティをロードするときにオブジェクトを構築できるようにするために、デフォルトのコンストラクタを必要とします。 NHibernateが構築されると、DBに存在するデータですべてのプロパティまたはメンバーが設定されます。

私の意見では、NHibernateは、DBからのデータでエンティティを復元するだけで、オブジェクトの状態に影響を与える可能性のある他のロジックは実行しないことです。

+0

しかし、パラメータctorが呼び出されるときは?デフォルトのものが2回実行された後に呼び出し、メモリを2回割り当てて、ちょっと変わって – gdoron

+0

ですが、データがロードされた後でイベントが必要です。 – Stig

+0

いくつかのロジックはコンストラクタで実行するのが重要です。そうでなければ、コンストラクタは時代遅れです。 NHが私のドメインを新しくしているからといって、コンストラクタコードはまだ多くのことにとって重要です。 – Stig

1

インターセプタを作成し、Instantiate()を上書きすることができます。

例えば:

public interface IInitializable 
{ 
    void Initialize(); 
} 

public class InitializingInterceptor : EmptyInterceptor 
{ 
    public override object Instantiate(string clazz, EntityMode entityMode, object id) 
    { 
     object result = base.Instantiate(clazz, entityMode, id); 

     var initializable = result as IInitializable; 
     if(initializable!=null) 
      initializable.Initialize(); 

     return result; 
    } 
} 
+0

名前と年齢をInitializeメソッドにどのように指定しますか? –

+0

@Jamie NHibernateは、ベースのインスタンシエートメソッド –

+0

でこれらのプロパティを既に水和しています。インスタンス化イベントはプロパティが設定される前ではありません。 :( – Stig