2010-10-13 7 views
5

Estoy intentando agregar una implementación de IPostLoadEventListener a mi configuración de NHibernate usando FluentNHibernate. Puedo hacerlo como se ilustra aquí:Escuchas de eventos NHibernate

how to add event listener via fluent nhibernate?

Sin embargo, la creación de una nueva matriz para reemplazar la antigua descarta por completo cualquier detector de eventos existentes. Puedo conseguir alrededor de ese modo:

return Fluently.Configure() 
    .Database(config) 
    .Mappings(m => m.AutoMappings.Add(mappings)) 
    .ExposeConfiguration(cfg => 
     { 
      cfg.EventListeners.PostLoadEventListeners = 
       new IPostLoadEventListener[] { 
        new UtcDateEventListener(), 
        new DefaultPostLoadEventListener() // <<< this one is the default 
       }; 
      cfg.EventListeners.SaveOrUpdateEventListeners = 
       new ISaveOrUpdateEventListener[] { 
        new UtcDateEventListener(), 
        new DefaultSaveOrUpdateEventListener() // <<< this one is the default 
       }; 
     }) 
    .BuildConfiguration() 
    .BuildSessionFactory(); 

Pero sólo saber acerca de los detectores de eventos por defecto por recorrer el código para determinar lo que estaba sobrescribiendo. Me gustaría agregar mi oyente de eventos sin sobrescribir ningún oyente de eventos existente, pero hacerlo como lo he mostrado anteriormente me parece muy mal. Los escuchas de eventos existentes están expuestos como una matriz (en lugar de una colección o una lista, lo que tendría más sentido). ¿Hay una manera más limpia de manejar esto?

+0

Sin embargo, esta es una publicación anterior, pero encontré un enlace interesante aquí: http://codebetter.com/petervanooijen/2015/04/13/using-nhibernate -eventlisteners-to-validate-and-audit-data/ – shankbond

Respuesta

5

¿Quieres decir algo como esto:

using System.Linq; 

... 

var list = cfg.EventListeners.PostLoadEventListeners.ToList(); 
list.Add(new MyPostLoadEventListener()); 
cfg.EventListeners.PostLoadEventListeners = list.ToArray(); 

que debería funcionar :)

1

Se podía extender la falta de pago ...

public class UtcDatePostLoadEventListener : DefaultPostLoadEventListener 
{ 
    public override void OnPostLoad(PostLoadEvent @event) 
    { 
     base.OnPostLoad(@event); 
    } 
} 

public class UtcDateSaveOrUpdateEventListener : DefaultSaveOrUpdateEventListener 
{ 
    public override void OnSaveOrUpdate(SaveOrUpdateEvent @event) 
    { 
     base.OnSaveOrUpdate(@event); 
    } 
} 

Pero, no estoy Seguro cómo se supone que debes saber cuándo hay un incumplimiento o no. Por ejemplo, no hay ninguno para PreUpdateEventListener ...

+0

Ese es mi problema. Según el código que tengo, dependo de un comportamiento que no está explícitamente definido/vinculado y puede cambiar con futuras implementaciones. Además, estoy implementando las interfaces directamente, de modo que si necesito implementaciones adicionales en el futuro, no dependo de una cadena de herencia. – Chris

+0

quizás sea mejor ir a la ruta de mookid8000. Estoy de acuerdo en que debería haber un método Add en lugar de jugar con matrices. Sé que uso algunos de los métodos de la clase Predeterminada, como 'GetEntityState', así que me resulta más fácil extenderme. – dotjoe

Cuestiones relacionadas