NHibernate和IoC接口

NHibernate和IoC接口,nhibernate,dependency-injection,ioc-container,Nhibernate,Dependency Injection,Ioc Container,我一直在尝试实现一个类似于Ayende在其MSDN文章中所发布的解决方案。幸运的是,Skooletz写了一篇类似的文章,这篇文章是在我试图通过他关于NHibernate拦截器魔术(,)的三部分博客文章来完成的。在实例化对象时,我很难让NHibernate调用我的POCO对象的参数化构造函数 当我删除受保护的无参数构造函数时,NHibernate抱怨InvalidProxyTypeException:“以下类型不能用作代理: YourNamespace.YourClass:类型应具有可见(公共或受

我一直在尝试实现一个类似于Ayende在其MSDN文章中所发布的解决方案。幸运的是,Skooletz写了一篇类似的文章,这篇文章是在我试图通过他关于NHibernate拦截器魔术(,)的三部分博客文章来完成的。在实例化对象时,我很难让NHibernate调用我的POCO对象的参数化构造函数

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

public MyClass
{
    IRequiredDependency dependency;

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

    protected MyClass() {}
}

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

在IoC容器的配置中,除了依赖项本身之外,还必须用依赖项声明类型

        container.RegisterType<IRequiredDependency, RequiredDependency>();
        container.RegisterType<MyClass, MyClass>();
container.RegisterType();
container.RegisterType();
我错过了(他在那里注册了Invoice类及其依赖项IInvoiceTotalCalculator),因为我使用的是Unity而不是Windsor


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

什么是“依赖项(在重载构造函数中)”?你能提供一点代码吗?你调用了参数化构造函数还是用拦截器初始化了依赖关系?你能显示相关的拦截器代码吗?有关拦截器代码,请参阅上面引用的使用NHibernate构建桌面待办应用程序的文章。