2009-09-16 22 views
15

Quiero agregar un detector de eventos (IPreUpdateEventListener) para agregar NHibernate, pero parece que no puedo encontrar un ejemplo cuando uso una configuración fluida.¿Cómo agregar el detector de eventos a través de Fluiber NHibernate?

Quiero poder agregar el oyente cuando creo la fábrica de sesiones, p. cuando se ejecuta el siguiente código.

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

¿Alguien sabe cómo hacer esto?

Respuesta

12

Última respuesta, encontré tu pregunta cuando intentaba hacer lo mismo. Encontrado una solución que debería funcionar:

_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

Tenga mucho cuidado con ese código. En realidad, está eliminando los detectores de eventos existentes en lugar de solo agregar los suyos a la lista. Acabo de descubrir que si trato de utilizar el bloqueo optimista en FluentNH (utilizando el mapeo de versión), no funcionará porque registra automáticamente algunos oyentes de eventos por sí mismo y el código que proporcionó los elimina. –

+1

OK, una corrección: estaba anulando a los oyentes equivocados para la auditoría. Pero aún queda mi pregunta: ¿es prudente suponer que puede eliminar cualquier oyente existente al llamar a ExposeConfiguration? –

31

Por lo tanto, la respuesta tardía, pero por el bien de la posteridad, para añadir oyentes sin quitar detectores de registro existentes (como la respuesta anterior de Bengt Se hará):

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

etc.

+0

Esto funcionó para mí, excepto que terminó agregando al oyente dos veces. Debe ser algo malo con mi configuración. Establecer en lugar de anexar funcionaba porque solo llamaba al método OnPreUpdate una vez. – shanabus

6

Resucitando a los muertos aquí, pero esto:

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

debe ser:

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

Creo que el método de 'setListener' (que se describe en otra respuesta) también eliminaría todos los oyentes anteriores.

Si usted está en algo un poco más dinámico, se puede hacer esto:

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

y luego llamar a algo como esto:

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

Esto permite un código más limpio, mientras que usted está mirando la configuración Fluent. También le permite registrar fácilmente un solo tipo en múltiples tipos de oyentes.

En cuanto a eliminar los oyentes predeterminados, no los eliminaría a menos que tenga un oyente que herede de la implementación de escucha predeterminada y llame a base.METHODNAME en los métodos reemplazados o replique el mismo comportamiento que los oyentes predeterminados.

Cuestiones relacionadas