События Ninject / NHibernate + Наблюдатель - PullRequest
2 голосов
/ 02 июня 2010

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

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

Ключевые моменты-

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

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

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

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

1 Ответ

1 голос
/ 23 марта 2012

Похоже, вы усложняете себе жизнь, пытаясь поместить шаблон 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...