Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NHibernate event listeners

Tags:

nhibernate

I'm trying to add an implementation of IPostLoadEventListener to my NHibernate configuration using FluentNHibernate. I can do so as illustrated here:

how to add event listener via fluent nhibernate?

However, creating a new array to replace the old one completely discards any existing event listeners. I can get around that like so:

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

But I only know about the default event listeners by stepping through the code to determine what I was overwriting. I'd like to add my event listener without overwriting any existing event listeners, but doing so like I've shown above seems very smelly, to me. The existing event listeners are exposed as an array (rather than a collection or a list, which would make more sense). Is there a cleaner way to handle this?

like image 223
Chris Avatar asked Oct 13 '10 18:10

Chris


2 Answers

Do you mean something like this:

using System.Linq;

...

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

That should work :)

like image 198
mookid8000 Avatar answered Oct 06 '22 04:10

mookid8000


You could just extend the default ones...

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

But, I'm not sure how you are supposed to know when there is a default in place or not. For example, there is none for the PreUpdateEventListener...

like image 41
dotjoe Avatar answered Oct 06 '22 05:10

dotjoe