2010-06-01 3 views
2

Я пытаюсь реализовать шаблон наблюдателя, используя ninject и NHibernate.События Ninject/NHibernate + шаблон наблюдателя

Я хотел бы иметь возможность вводить наблюдателей, которые действуют как «триггеры», когда объект сохраняется или удаляется через NHibernate.

Ключевого процентный пункт

  1. Я хочу, чтобы наблюдатель, чтобы получать уведомления в любое время объект сохранялось, включая каскадирование позволяет экономить, поэтому я использую событие NHibernate PostInsert/PostUpdate.
  2. Я хочу иметь возможность вводить наблюдателей через Ninject (не хочу, чтобы ядро ​​находилось где-нибудь в обработчиках событий nhibernate).
  3. Наблюдатели различаются в зависимости от типа объекта, который сохраняется, поэтому мне нужен хороший способ узнать, какие наблюдатели должны быть вызваны в событиях NHibernate.

Мой код отлично работает теперь для объектов, которые загружаются через NHibernate с использованием впрыска конструктора. В модель домена вводится класс наблюдателя, который переносится через события nhibernate и может быть запущен без проблем.

Проблема: В нашей существующей кодовой базе используются конструкторы по умолчанию для наших объектов домена по сравнению с фабрикой. Из-за этого наблюдатели не будут впрыскиваться, если мы не переключимся на использование фабрики.

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

+0

так что вы не можете поместить ctor на объекты домена с зависимостями, указанными в аргументах ctor? – AaronHS

ответ

1

Похоже, вы делаете жизнь сложной для себя, пытаясь поместить шаблон Observer поверх шаблона обработчика событий NHibernate.

NHibernate уже предоставляет возможность подключения подключаемых прослушивателей событий - почему бы просто не использовать это?

class FooPostInsertEventListener : IPostInsertEventListener 
{ 
    public void OnPostInsert(PostInsertEvent @event) 
    { 
     var entity = @event.Entity; 
     var entityType = entity.GetType(); 

     if (entityType != typeof(Foo)) return; 

     ProcessFoo(entity); 
    } 
} 

Если вы отчаянно пройти через ядро, то вы можете даже использовать ядра при настройке NHibernate. Что-то вроде этого:

config.EventListeners.PostInsertEventListeners = Kernel.GetAll<IPostInsertEventListener>().ToArray();