Слушатели событий NHibernate - PullRequest
       0

Слушатели событий NHibernate

5 голосов
/ 13 октября 2010

Я пытаюсь добавить реализацию IPostLoadEventListener в мою конфигурацию NHibernate, используя FluentNHibernate.Я могу сделать это, как показано здесь:

как добавить прослушиватель событий через свободный nhibernate?

Однако создание нового массива для замены старого полностью отбрасывает все существующиеслушатели событий.Я могу обойти это так:

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

Но я знаю только о прослушивателях событий по умолчанию, шагая по коду, чтобы определить, что я перезаписываю.Я хотел бы добавить своего слушателя событий, не перезаписывая ни одного из существующих слушателей событий, но делать так, как я показал выше, мне кажется очень вонючим.Существующие прослушиватели событий представляются в виде массива (а не коллекции или списка, что более логично).Есть ли более чистый способ справиться с этим?

Ответы [ 2 ]

5 голосов
/ 13 октября 2010

Вы имеете в виду что-то вроде этого:

using System.Linq;

...

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

Это должно работать:)

1 голос
/ 13 октября 2010

Вы можете просто расширить стандартные ...

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

Но я не уверен, как вы должны знать, когда по умолчанию или нет. Например, для PreUpdateEventListener нет ничего ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...