Как добавить прослушиватель событий через Fluent NHibernate? - PullRequest
17 голосов
/ 16 сентября 2009

Я хочу добавить прослушиватель событий (IPreUpdateEventListener) для добавления NHibernate, но я не могу найти пример при использовании беглой конфигурации.

Я хочу иметь возможность добавлять прослушиватель при создании фабрики сеансов, например когда следующий код выполняется.

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

Кто-нибудь знает, как это сделать?

Ответы [ 3 ]

32 голосов
/ 21 февраля 2011

Итак, поздний ответ, но ради потомков, добавить слушателей, не удаляя существующих слушателей регистрации (как будет делать более ранний ответ от Bengt Be):

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

и т.д.

13 голосов
/ 09 октября 2009

Поздний ответ, нашел ваш вопрос, когда я пытался сделать то же самое. Нашел решение, которое должно работать:

_sessionFactory = Fluently.Configure()
   .Database(MsSqlConfiguration.MsSql2005.ConnectionString(connectionString).ShowSql())
   .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Entity>())
   .ExposeConfiguration(c => c.EventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] {new AuditEventListener()});
6 голосов
/ 30 августа 2011

Воскресение мертвых здесь, но это:

........
   .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 для переопределенных методов или реплицирует то же поведение, что и слушатели по умолчанию. 1017 *

...