2009-09-16 10 views
15

Chcę dodać detektor zdarzeń (IPreUpdateEventListener), aby dodać NHibernate, ale nie mogę znaleźć przykładu przy użyciu płynnej konfiguracji.Jak dodać detektor zdarzeń za pomocą Fluent NHibernate?

Chcę móc dodać odbiornik podczas tworzenia fabryki sesji, np. po wykonaniu następującego kodu.

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

Ktoś wie, jak to zrobić?

Odpowiedz

12

Późna odpowiedź, znalazłem twoje pytanie, gdy próbowałem zrobić to samo. Znaleziono rozwiązanie, które powinno działać:

_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

Należy bardzo uważać na ten kod. W rzeczywistości usuwasz istniejące detektory zdarzeń, zamiast tylko dodawać własne do listy. Właśnie odkryłem, że jeśli spróbuję użyć optymistycznego blokowania w FluentNH (używając odwzorowania wersji), to nie zadziała, ponieważ automatycznie rejestruje niektóre detektory zdarzeń samodzielnie, a podany kod je usuwa. –

+1

OK, korekta: nadpisałem niewłaściwych słuchaczy do audytu. Ale wciąż pozostaje moje pytanie: czy mądrze jest założyć, że można usunąć istniejących słuchaczy podczas wywoływania ExposeConfiguration? –

31

Więc późno odpowiedzi, ale dla dobra przyszłych pokoleń, aby dodać słuchaczy bez usuwania istniejących słuchaczy rejestracyjne (podobnie jak wcześniej odpowiedź od Bengt Be zrobi):

var config = new Configuration(); 
config.AppendListeners (ListenerType.PreUpdate, new [] { new AuditEventListener() }); 

itp

+0

To zadziałało dla mnie, z wyjątkiem tego, że w końcu doszło do dwukrotnego dołączenia słuchacza. To musi być coś nie tak z moją konfiguracją. Ustawienie zamiast załączania działało w ten sposób, że raz wywoływało tylko metodę OnPreUpdate. – shanabus

6

wskrzesza zmarłych tu jednak:

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

Powinno być:

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

Wierzę, że metoda "SetListener" (opisana w innej odpowiedzi) również usunie wszystkich poprzednich słuchaczy.

Jeśli do czegoś trochę bardziej dynamiczny, można to zrobić:

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 
        }); 
       } 
      }); 
    } 

a następnie wywołać coś takiego:

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

Pozwala to na czystszego kodu podczas gdy patrzysz konfiguracja płynna. Pozwala także łatwo zarejestrować jeden typ dla wielu typów słuchaczy.

Jeśli chodzi o usuwanie domyślnych programów nasłuchujących, nie będę ich usuwać, chyba że mam odbiornik, który dziedziczy z domyślnej implementacji detektora i wywołuje base.METHODNAME na zastąpionych metodach lub replikuje to samo zachowanie, co domyślne detektory.