2010-06-01 61 views
2

我想实现一个使用ninject和NHibernate的观察者模式。Ninject/NHibernate事件+观察者模式

我希望能够通过NHibernate持久化或删除对象时,能够注入充当“触发器”的观察者。

关键点 -

  1. 我想观察者通知的对象持久化任何时候,包括级联保存,这就是为什么我使用NHibernate PostInsert/PostUpdate事件。
  2. 我希望能够通过Ninject注入观察者(不想在nhibernate事件处理程序中的任何地方)。
  3. 根据持久化对象的类型,观察者是不同的,所以我需要一个很好的方法来知道应该在NHibernate事件中调用哪些观察者。

我的代码现在对使用构造函数注入通过NHibernate加载的对象非常有效。一个观察者类被注入域模型,它通过nhibernate事件进行,并且可以被解雇没有问题。

问题:我们现有的代码库使用我们的域对象与工厂的默认构造函数。因此,除非我们改用工厂,否则观察员将不会注入。

我知道将所有内容切换到工厂都可以,但我想看看是否有人有更好的建议来完成此任务。那么,我应该让工厂来实例化新对象还是其他东西?

+0

所以你不能把构造函数与在构造函数的参数列出的依赖关系的域对象的? – AaronHS 2012-02-16 11:16:28

回答

1

它看起来像你正在使自己的生活变得复杂,试图把观察者模式放在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();