2009-09-16 6 views
15

Je veux ajouter un écouteur d'événement (IPreUpdateEventListener) pour ajouter NHibernate mais je n'arrive pas à trouver un exemple lorsque j'utilise une configuration fluide.Comment ajouter un écouteur d'événement via Fluent NHibernate?

Je veux être en mesure d'ajouter l'écouteur lorsque je crée la fabrique de sessions, par ex. lorsque le code suivant est exécuté.

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

Quelqu'un sait-il comment faire?

Répondre

12

Réponse tardive, trouvé votre question lorsque j'essayais de faire la même chose. Trouvé une solution qui devrait fonctionner:

_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

Soyez très prudent avec ce code. Vous supprimez actuellement les écouteurs d'événement existants au lieu de simplement ajouter les vôtres à la liste. Je viens de découvrir que si j'essaie d'utiliser le verrouillage optimiste dans FluentNH (en utilisant le mappage de Version), cela ne fonctionnera pas car il enregistre automatiquement certains écouteurs d'événements et le code que vous avez fourni les supprime. –

+1

OK, une correction: je remplaçais les mauvais auditeurs pour l'audit. Mais encore ma question demeure: est-il sage de supposer que vous pouvez supprimer tous les écouteurs existants lors de l'appel à ExposeConfiguration? –

31

Donc, réponse tardive, mais pour la postérité, pour ajouter des écouteurs sans suppression d'écouteurs d'enregistrement existants (comme la première réponse de Bengt Soyez le fera):

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

etc.

+0

Cela a fonctionné pour moi, sauf qu'il a fini par ajouter deux fois l'auditeur. Doit être quelque chose de mal avec ma config. Le réglage au lieu de l'ajout fonctionnait en ce sens qu'il n'appelait qu'une seule fois la méthode OnPreUpdate. – shanabus

6

Ressusciter les morts ici, mais ceci:

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

devrait être:

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

Je crois que la méthode « SetListener » (décrit dans une autre réponse) supprimerait également tous les auditeurs précédents.

Si vous êtes en quelque chose d'un peu plus dynamique, vous pouvez le faire:

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

Et puis appelez quelque chose comme ceci:

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

Cela permet un code plus propre pendant que vous regardez la configuration Fluent. Il vous permet également d'enregistrer facilement un seul type à plusieurs types d'écouteurs. Pour supprimer les écouteurs par défaut, je ne les supprimerais pas à moins qu'un écouteur hérite de l'implémentation de l'écouteur par défaut et appelle base.METHODNAME sur les méthodes surchargées ou réplique le même comportement que celui des écouteurs par défaut.