Fluent NHibernate中的DB特定约定

Fluent NHibernate中的DB特定约定,nhibernate,orm,fluent-nhibernate,automapping,Nhibernate,Orm,Fluent Nhibernate,Automapping,我有一套流畅的NHibernate约定,其中大多数是独立于数据库的。但是,有一对依赖于DBMS的字符串属性: Public Sub Apply(ByVal instance As IPropertyInstance) Implements IConvention(Of IPropertyInspector, IPropertyInstance).Apply instance.CustomSqlType("VARCHAR2(50 BYTE)") End Sub 实际上,我只是使用这样一种

我有一套流畅的NHibernate约定,其中大多数是独立于数据库的。但是,有一对依赖于DBMS的字符串属性:

Public Sub Apply(ByVal instance As IPropertyInstance) Implements IConvention(Of IPropertyInspector, IPropertyInstance).Apply
    instance.CustomSqlType("VARCHAR2(50 BYTE)")
End Sub
实际上,我只是使用这样一种约定来生成数据库(即对象优先开发)。这对Oracle来说非常有效,但我想使用内存中的SQLite DB进行单元测试,显然这种约定不起作用,因为SQLite没有VARCHAR2类型

在这种情况下,有人对如何配置Fluent NHibernate有什么好的建议或参考吗

目前,我正在考虑使用一组与数据库无关的通用约定,然后在子目录/名称空间中使用依赖的约定。然后,我将拥有某种配置,允许我指定一个自定义ITypeSource组件,该组件将拾取所有通用约定以及与特定DBMS关联的约定,例如SqlConventionTypeSource、OracleConventionTypeSource

亲切问候,,
Ryan。

您通常在可执行文件中设置约定(以及fluent配置的其余部分)

这意味着您的GUI、单元测试以及任何其他使用基于
ISession
/
ISessionFactory
的服务的东西中都会有不同的流畅配置

在我看来,您似乎已经对配置进行了硬编码,现在正试图找出如何让“配置器”根据环境的某些信息采取不同的操作

一种更简单的方法是在顶层创建配置,并将其作为依赖项提供给任何需要它的对象。这样,您就不会被困在来自不同环境的相同代码路径中

无论依赖于NHibernate的是什么,都将其设置为接受
ISession
ISessionFactory
作为构造函数参数或属性设置器。那你就不会有这个问题了。您甚至可以为实际上不需要查询数据存储的测试模拟它


当然,您仍然可以将创建FNH配置的任何类设置为自身可配置,并在配置行中使用条件语句。但通常一个FNH配置一开始就只有那么几行代码,这似乎不值得。只需为SQL Server、Oracle、SQLite等创建完全独立的配置,这样您就不必在每次进行微小更改时都不断维护它。

感谢您的回复Aaronaught.FYI;我使用Castle.Facilities.NHibernate集成库将NHibernate配置为Windsor IoC。这样,所有使用NHibernate的“我的服务/演示者”都可以使用ISessionManager作为必需/可选的类依赖项创建。当我解析服务时,Windsor将注入ISessionManager的具体实现。基本上,我真的不需要太担心使用该工具的会话管理(例如,每个请求打开会话),它使我能够通过模拟ISessionManager进行良好的单元测试。我可以通过facilities IConfigurationBuilder界面修改会话工厂的默认配置,在这里,我使用自动映射和约定流畅地配置NHibernate会话工厂。我需要告诉FNH AutoPersistenceModel在哪里可以找到约定,这些约定非常适合重复使用,因为它们相当复杂,定义良好,并且不太可能改变。这又回到了我最初的问题,我的一些约定是特定于DB的(即用于生成模式的约定)。@Ryan:如果使用依赖项注入,这似乎应该不是问题。您实际上是在使用IoC进行注入,还是依赖于某种单例/服务定位器模式?您应该能够专门为您的测试创建不同的
ISessionManager
实现,并将其传递给需要测试的任何对象。