Как добавить прослушиватель событий через Fluent NHibernate?
Я хочу добавить прослушиватель событий (IPreUpdateEventListener
), чтобы добавить NHibernate, но я не могу найти пример при использовании свободной конфигурации.
Я хочу добавить слушателя при создании сеанса factory, например. когда выполняется следующий код.
_sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2005.ConnectionString(connectionString).ShowSql())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<IEntity>())
.BuildSessionFactory();
Кто-нибудь знает, как это сделать?
Ответы
Ответ 1
Поздний ответ нашел ваш вопрос, когда я пытался сделать то же самое. Найдите решение, которое должно работать:
_sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2005.ConnectionString(connectionString).ShowSql())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Entity>())
.ExposeConfiguration(c => c.EventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] {new AuditEventListener()});
Ответ 2
Итак, поздний ответ, но ради потомства, добавить слушателей, не удаляя существующих слушателей регистрации (например, более ранний ответ от Bengt Be):
var config = new Configuration ();
config.AppendListeners (ListenerType.PreUpdate, new [] { new AuditEventListener () });
и др.
Ответ 3
Воскрешение мертвых здесь, но это:
........
.ExposeConfiguration(c => c.EventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] {new AuditEventListener()});
Должно быть:
.ExposeConfiguration(c => c.AppendListeners(ListenerType.PreUpdate, new object[]
{
new AuditEventListener()
});
Я считаю, что метод SetListener (описанный в другом ответе) также удалит всех предыдущих слушателей.
Если вы участвуете в чем-то более динамичном, вы можете сделать это:
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
});
}
});
}
И затем вызовите что-то вроде этого:
AddListenerToConfiguration<AuditEventListener>(smFactory,
ListenerType.PreUpdate);
Это позволяет использовать более чистый код, пока вы смотрите на конфигурацию Fluent. Он также позволяет легко зарегистрировать один тип для нескольких типов прослушивателей.
Что касается удаления прослушивателей по умолчанию, я бы не удалял их, если у меня нет слушателя, который наследуется от реализации исполнителей по умолчанию и вызывает base.METHODNAME в переопределенных методах или реплицирует то же поведение, что и слушатели по умолчанию.