2009-09-16 16 views
15

NHibernateを追加するためにイベントリスナー(IPreUpdateEventListener)を追加したいが、流暢な設定を使用しているときに例が見つからないようです。Fluent NHibernateでイベントリスナーを追加するには?

私は、セッションファクトリを作成するときにリスナーを追加できます。次のコードが実行されたとき。

_sessionFactory = Fluently.Configure() 
    .Database(MsSqlConfiguration.MsSql2005.ConnectionString(connectionString).ShowSql()) 
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<IEntity>()) 
    .BuildSessionFactory(); 

誰でもこの方法を知っていますか?

答えて

12

遅くとも、私が同じことをしようとしていたときにあなたの質問を見つけました。 (ベングトから以前の回答のように行いますこと)、だから、後半の応答を

_sessionFactory = Fluently.Configure() 
    .Database(MsSqlConfiguration.MsSql2005.ConnectionString(connectionString).ShowSql()) 
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Entity>()) 
    .ExposeConfiguration(c => c.EventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] {new AuditEventListener()}); 
+3

このコードには十分注意してください。自分自身をリストに追加するのではなく、実際には既存のイベントリスナーを削除しています。 FluentNH(バージョンマッピングを使用)でオプティミスティックロックを使用しようとすると、いくつかのイベントリスナーが自動的に登録され、提供されたコードによってそれらが削除されるため、機能しません。 –

+1

OK、訂正:間違ったリスナーを監査のために上書きしていました。しかし、私の質問は残っています:ExoseConfigurationを呼び出すときに既存のリスナーを削除できると仮定するのは賢明でしょうか? –

31

が、後世のために、既存の登録リスナーを削除せずにリスナーを追加する:動作するはず解決策を見つけた

var config = new Configuration(); 
config.AppendListeners (ListenerType.PreUpdate, new [] { new AuditEventListener() }); 
ここでは死者を復活

など

+0

これはリスナーを2度追加することを除いて、私にとってはうまくいった。私の設定で何かが間違っている必要があります。追加するのではなく、OnPreUpdateメソッドを1回だけ呼び出すという点では機能しませんでした。 – shanabus

6

が、この:

........ 
    .ExposeConfiguration(c => c.EventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] {new AuditEventListener()}); 

は次のようになります。

.ExposeConfiguration(c => c.AppendListeners(ListenerType.PreUpdate, new object[] 
    { 
     new AuditEventListener() 
    }); 

私は(別の答えに記載されている)「SetListener」メソッドはまた、以前のすべてのリスナーを削除すると考えています。

private void AddListenerToConfiguration<T>(FluentConfiguration config, params ListenerType[] typesForListener) 
     where T : class 
    { 
     var listener = Activator.CreateInstance<T>(); 

     config.ExposeConfiguration(x => 
      { 
       foreach (var listenerType in typesForListener) 
       { 
        x.AppendListeners(listenerType, new T[] 
        { 
         listener 
        }); 
       } 
      }); 
    } 

をしてから、このような何かを呼び出す:

あなたが何かにもう少し動的である場合は、この操作を行うことができ、あなたが見ている間、

AddListenerToConfiguration<AuditEventListener>(smFactory, 
      ListenerType.PreUpdate); 

これは、クリーンなコードを可能にFluentの設定また、1つのタイプを複数のリスナータイプに簡単に登録することもできます。私はデフォルトのリスナーの実装から継承し、オーバーライドされたメソッドにbase.METHODNAMEを呼び出すか、デフォルトのリスナーと同じ動作を複製し、リスナーがない限り

デフォルトのリスナーを除去するためとして、私はそれらを削除しません。

関連する問題