2010-10-13 3 views
5

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

how to add event listener via fluent 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(); 

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

+0

Однако это старый пост, но я нашел интересную ссылку здесь: http://codebetter.com/petervanooijen/2015/04/13/using-nhibernate -eventlisteners-to-validate-and-audit-data/ – shankbond

ответ

5

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

using System.Linq; 

... 

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

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

1

Вы можете просто расширить те по умолчанию ...

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 нет ...

+0

Это моя проблема. В зависимости от кода я имею в виду, что я зависим от поведения, которое явно не определено/не связано и может измениться с будущими реализациями. Кроме того, я реализую интерфейсы напрямую, поэтому, если мне понадобится дополнительная реализация в будущем, я не буду зависеть от цепочки наследования. – Chris

+0

, может быть, лучше всего пойти на маршрут mookid8000. Я согласен, должен быть метод Add вместо того, чтобы возиться с массивами. Я знаю, что я использую некоторые из методов класса Default, такие как 'GetEntityState', поэтому мне легче просто расширить. – dotjoe

Смежные вопросы