【问题标题】:Ninject / NHibernate Events + Observer PatternNinject / NHibernate 事件 + 观察者模式
【发布时间】:2010-06-01 20:56:20
【问题描述】:

我正在尝试使用 ninject 和 NHibernate 实现观察者模式。

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

关键点-

  1. 我希望在对象被持久化(包括级联保存)时随时通知观察者,这就是我使用 NHibernate PostInsert/PostUpdate 事件的原因。
  2. 我希望能够通过 Ninject 注入观察者(不希望内核在 nhibernate 事件处理程序中的任何位置)。
  3. 观察者因持久化对象的类型而异,因此我需要一种很好的方法来了解应该在 NHibernate 事件中调用哪些观察者。

我的代码现在非常适合使用构造函数注入通过 NHibernate 加载的对象。一个观察者类被注入到领域模型中,它通过nhibernate事件进行,可以毫无问题地触发。

问题:我们现有的代码库对我们的域对象使用默认构造函数而不是工厂。因此,除非我们切换到使用工厂,否则不会注入观察者。

我知道将所有东西都切换到工厂是可行的,但我想看看是否有人有更好的建议来实现这一点。那么,我应该创建一个工厂来实例化新对象还是其他东西?

【问题讨论】:

  • 所以您不能将 ctor 放在具有 ctor 参数中列出的依赖项的域对象上?

标签: nhibernate ninject observer-pattern


【解决方案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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-04
    • 2016-02-20
    • 2023-04-10
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多