【问题标题】:NHibernate Multiple Event ListenersNHibernate 多事件监听器
【发布时间】:2011-07-05 13:27:11
【问题描述】:

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

我们目前使用 .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 重复。

【问题讨论】:

    标签: c# nhibernate fluent-nhibernate addeventlistener


    【解决方案1】:

    监听器实际上并不是监听器,它们是实现者。 “事件”只能有一种实现。

    您可以实现一个侦听器,您可以在其中插入多个实现。例如,不同实体类型的实现。您可以将“事件”传递给每个实现,直到其中一个处理它(例如,当实现ISoftDeletable 接口时,SoftDeleteImplementor 正在处理它)。您需要关心相互竞争的实现者(更多的可能是处理它,您调用它们的顺序很重要)。

    【讨论】:

    • 这对我来说很有道理,一个很好的解释,让我的想法走上了正轨!
    【解决方案2】:

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

    如果您在一种类型上有多个事件侦听器,那么您的应用程序就会出现一些性能问题。如果您想使用此侦听器处理不同的实体,请在您的 SoftDeleteListener 类中进行。

    【讨论】:

    • 我同意,这只是一个例子。该问题与注册多个相同类型的侦听器有关。如果有帮助,让我们假设侦听器是不同的类型,即 PostUpdate、PreInsert 等
    • 好的。只需使用此“config.SetListener(ListenerType.Delete, new SoftDeleteListener());”添加另一行。就是这样。
    【解决方案3】:

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

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

    【讨论】:

    • 有一个SetListeners(ListenerType, object[]) 方法应该可以按照您的描述进行操作。
    猜你喜欢
    • 2011-04-25
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 2018-06-01
    • 2010-12-11
    • 1970-01-01
    相关资源
    最近更新 更多