2011-02-28 185 views
2

是否可以注册多个事件监听器?NHibernate多事件监听器

我们目前使用.ExposeConfiguration(AddSoftDelete)注册事件侦听器,其中AddSoftDelete是注册侦听器的类;

private static void AddSoftDelete(Configuration config) 
{ 
    config.SetListener(ListenerType.Delete, new SoftDeleteListener()); 
} 

我们已经发现,我们无法注册相同类型的多个事件侦听器,即我们不能注册多个监听器“ListenerType.Delete”。

是否可以注册新的听众而不会覆盖任何现有的听众?

解决...

已成功地注册使用下面的代码多受话器。

config.EventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] 
                   { 
                    new Listener1(), 
                    new Listener2() 
                   }; 

对每个ListenerType重复。

回答

0

听众实际上不是听众,他们是实现者。只有一个“事件”的实现。

您可以实现一个侦听器,您可以在其中插入多个实现。例如针对不同实体类型的实现。您可以将“事件”传递给每个实现,直到其中一个处理它为止(例如,当实现接口ISoftDeletable时,SoftDeleteImplementor正在处理它)。你需要关心竞争性的实现者(更多的人可以处理它,这个命令对你来说很重要)。

+0

这对我来说很有意义,这是一个非常好的解释,它将我的想法引向正确的轨道! – Wozart 2011-02-28 13:18:58

0

为什么需要注册多个ListenerType.Delete?

如果您在一种类型上有多个事件侦听器,那么应​​用程序会出现一些性能问题。如果你想用这个监听器来处理不同的实体,那么在你的SoftDeleteListener类中。

+0

我同意,这只是一个例子而已。问题与注册多个相同类型的监听器有关。如果有帮助,我们假设侦听器是不同的类型,即PostUpdate,PreInsert等。 – Wozart 2011-02-28 07:27:38

+0

OK。只需添加另一行“config.SetListener(ListenerType.Delete,new SoftDeleteListener());”。而已。 – 2011-02-28 08:05:43

0

我在我的代码中做了类似的事情。 NHibernate.Cfg.Configuration对象应该有一个AppendListeners(ListenerType类型,object []侦听器)方法。

还有一个SetListeners方法,我假设它会替代侦听器列表而不是添加到它。

+1

有一个'SetListeners(ListenerType,object [])'方法应该执行你所描述的。 – 2011-04-11 09:25:30