如何配置Fluent NHibernate使用Iuser类型实现和IoC构造函数注入(非空构造函数)

如何配置Fluent NHibernate使用Iuser类型实现和IoC构造函数注入(非空构造函数),nhibernate,fluent-nhibernate,dependency-injection,Nhibernate,Fluent Nhibernate,Dependency Injection,从2.1版开始,NHibernate支持通过IoC容器(通过字节码提供程序配置设置提供)为IUSERTYPE注入构造函数 但是,当我试图通过Fluent NHibernate配置(而不是自动映射)使其正常工作时,当我构建配置时,我会遇到一个异常,抱怨我的一个对象(在本例中是自定义ICompositeUserType)没有空的默认构造函数 我将此异常追溯到FluentNHibernate.Mapping.PropertyPart.AddColumnsFromCompositeUserType(类型

从2.1版开始,NHibernate支持通过IoC容器(通过字节码提供程序配置设置提供)为IUSERTYPE注入构造函数

但是,当我试图通过Fluent NHibernate配置(而不是自动映射)使其正常工作时,当我构建配置时,我会遇到一个异常,抱怨我的一个对象(在本例中是自定义ICompositeUserType)没有空的默认构造函数

我将此异常追溯到FluentNHibernate.Mapping.PropertyPart.AddColumnsFromCompositeUserType(类型compositeUserType)中对Activator.CreateInstance()的调用

NHibernate的IoC支持功能的全部要点是将对Activator.CreateInstance的调用替换为对提供的自定义字节码提供程序的调用

所以我想我的问题是:有没有可能让它与Fluent NHibernate一起工作,或者我必须放弃我的Fluent NH配置,回到NHibernate的内置编程配置

有关此功能的博客帖子链接:

更新:看起来问题在于FluentNHibernate处理ICompositeUserType的自定义实现。我将复合用户类型更改为IUserType(这可能更适合于类的实际情况),看起来Fluent NHibernate现在正在合作


更新#2:添加一个空构造函数确实解决了这个问题-我会将此标记为已回答,但该建议是在注释中而不是在答案中提出的,因此我将对这些注释进行投票(直到添加正式答案).

请记住,Fluent NHibernate所做的只是创建与使用NHibernate XML相同的配置对象结构。您是如何通过Fluent NHibernate设置字节码提供程序的?

我不知道答案,但我很确定您可以自由地混合使用XBM和Fluent映射,因此在任何情况下,您都不必放弃整个FNH工作。如果提供默认的空构造函数(公共或受保护),会发生什么情况?@Jamie Ide,我刚刚意识到你的建议,听起来很简单,正是Rich和我下面讨论的内容。我会尝试一下,然后再报告。好的,现在我正在呼叫NhEnvironment.BytecodeProvider=newmycustombytecodeprovider(\u container);就在fluentConfig.BuildConfiguration()之前(出现异常的地方)。从我在Fluent NH源代码中看到的情况来看,我在哪里调用它可能永远都不重要,因为它仍然使用Activator.CreateObject()在生成映射配置时,没有任何明显的条件逻辑来实例化我的用户类型。让我困惑的是,为什么Fluent NHibernate会首先关心实例化ICompositeUserType。顺便说一下,在GitHub代码中,我没有看到PropertyPart类,但我确实看到了您在Builders.PropertyBuilder类中提到的方法。如果必须猜测的话,它必须执行约定,以便复合类型中的每个适当属性都有映射到它们的列。假设这样,您似乎可以添加一个空构造函数,因为它应该只由收集元数据的流畅代码调用。NHibernate本身希望使用IOC.good point,但现在我必须表明我的无知,并问,鉴于两个公共构造函数(一个带args,另一个不带args),像StructureMap这样的IOC容器会使用空构造函数吗?如果是这样,如果我将空构造函数设置为受保护的,Fluent的Activator.CreateInstance()调用会对该类起作用吗?受保护的构造函数只能从子类访问,所以这不会起作用。仅出于测试目的,您可以在空构造函数中设置一个标志,并在ICompositeUserType方法中检查它,如果从空构造函数调用它来测试StructureMaps实例化,则抛出exception。