【问题标题】:NHibernate and IoC IInterceptorNHibernate 和 IoC IInterceptor
【发布时间】:2011-02-15 14:51:26
【问题描述】:

我一直在尝试实施类似于 Ayende 在他的 MSDN 文章 Building a Desktop To-Do Application with NHibernate 中发布的解决方案。幸运的是,Skooletz 写了一篇类似的文章,在他的关于 NHibernate 拦截器魔术技巧的 3 部分博客文章(123)中跟进了我想要完成的工作。在实例化对象时,我无法让 NHibernate 调用我的 POCO 对象的参数化构造函数。

当我删除受保护的无参数构造函数时,NHibernate 抱怨 InvalidProxyTypeException:“以下类型可能不能用作代理: YourNamespace.YourClass: type 应该有一个可见的(公共的或受保护的)无参数构造函数”。如果我然后添加受保护的默认构造函数,NHibernate 不再抱怨,但永远不会调用依赖项(在重载的构造函数中)导致应用程序当依赖不满足时,在运行时抛出 NullReferenceException。

public MyClass
{
    IRequiredDependency dependency;

    public MyClass(IRequiredDependency dependency)
    {
        this.dependency = dependency;
    }

    protected MyClass() {}
}

我似乎无法让 NHibernate 调用重载的构造函数。有什么想法吗?

【问题讨论】:

  • 什么是“依赖项(在重载的构造函数中)”?能提供一点代码吗?
  • 你是调用了参数化的构造函数,还是以某种方式通过拦截器初始化了依赖关系?
  • 能否展示相关的拦截器代码?
  • 相关拦截器代码请参考上文引用的使用NHibernate构建桌面待办应用一文。

标签: nhibernate dependency-injection ioc-container


【解决方案1】:

在 IoC 容器的配置中,除了依赖本身,你还必须声明你的类型。

        container.RegisterType<IRequiredDependency, RequiredDependency>();
        container.RegisterType<MyClass, MyClass>();

我错过了来自 Pablo's post 的小花絮(他注册了 Invoice 类以及它的依赖项,IInvoiceTotalCalculator),因为我使用的是 Unity 而不是 Windsor。

另外一个注意事项:我发现,如果您想拥有任何其他重载的构造函数,请将它们设为内部,将默认构造函数保留为受保护,并且只有一个包含您的依赖项的公共构造函数.这个花絮帮助加强了我对这些类的一些 API 设计。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    相关资源
    最近更新 更多