2011-01-18 7 views
3

たとえば、私は一連のドメインクラスを持っています。これらのクラスは共通のインタフェースを実装しています。インタフェースはpublicですが、クラス自体は内部です。これらのクラスのインスタンスは、公開されている提供されたファクトリを使用して作成できます。さらに、各クラスインスタンスは、階層ごとの1テーブル手法を使用して永続化されます。流暢なnhibernateを使用して、ファクトリメソッドを使用してクラスのインスタンスを作成することはできますか?

Fluent NHibernateはこの場合どのように使用できますか?どんな助けでも大歓迎です。

おかげで、 ブレイク

答えて

2

はこのFNHよりNHibernateは特定されていますが、私の知る限り見ることができるように2つのオプションがあります。

  1. IInterceptor.Instantiate(string entityName, EntityMode entityMode, object id)を実装する - あなたはまた、関連付けしなければならない作業を開始する任意のNHibernateのセッションでインターセプタを述べました。

  2. ReflectionOptimizer' and implement the CreateInstance()メソッド(ファクトリを構築する各タイプごとに1つずつ必要)をサブクラスhttp://fabiomaulo.blogspot.com/2008/11/entities-behavior-injection.htmlにします。私は完全に理解していないいくつかの構成と配線があり、これは基本的に方法#1の過度のバージョンと思われます。

あなたのドメインクラスの永続フィールドとプロパティを注入するために欠けている場合は、一般化するという非自明な問題であるとことを行う方法がある場合、私はわかりません。

1

また、NHibernate 2.0以降のイベントシステムを利用することもできます。 Loadイベントでは、NHibernateのオブジェクトも作成できます。 ILoadEventListenerの実装を作成し、それをISessionFactoryまたはISessionのイベントリスナーに追加して利益を得るだけです。

using NHibernate.Event.Default 

public class MyCreatorListener : DefaultLoadEventListener 
{ 
    // this is the single method defined by the LoadEventListener interface 
    public override void OnLoad(LoadEvent theEvent, LoadType loadType) 
    { 
    if(null == theEvent.InstanceToLoad) // Not null if user supplied object 
    { 
     theEvent.InstanceToLoad = MyFactory.Create(loadType); // Or whatever. 
    } 
    } 
} 
関連する問題