2

我已经使用多会话工厂对象构建了一个基于 Spring.NET/NHibernate 的应用程序。

我将所有 hbm 文件放在一个程序集中。

/Assembly/
....Database1
........abc.hbm.xml
....Database2
........xyz.hbm.xml

我想知道是否有任何方法可以排除会话工厂对象定义的 hbm 文件。

就像这样(你看到排除标签了吗?):

<object id="Db1SessionFactory" type=DataAccess.HibernateLocalSessionFactoryObject, DataAccess">
<property name="MappingAssemblies">
    <list>
         <value>DataAccess</value>
         <exclude>xyz.hbm.xml</eclude>
    </list>
</property>

或者...,也许您可​​以通过其他解决方案帮助我?另外,我不想将 hbm 文件分成几个程序集。

4

1 回答 1

0

我不会采用排除方式,因为这需要您在为“数据库 3”添加映射文件时更改生产中的所有配置文件。更好的方法是专门包含会话工厂所需的映射(目录)。

话虽如此,您可以实现自己的SessionFactoryObject继承,LocalSessionFactoryObject它需要一个程序集和(例如)一个命名空间或文件夹来加载程序集。有关如何SessionFactoryObject使用自定义配置创建自己的示例,您可以查看Benny Michielsen 的 FluentNHibernate 示例

编辑......它可能看起来像这样(未经测试!)

public class LoadMappingsFromFolderInAssemblySessionFactoryObject
              : LocalSessionFactoryObject
{
    // inject with the name of the assembly to load
    public string MyMappingAssembly { get; set; }
    // inject with the path to the folder within the assembly
    public string MyFolder { get; set; }

    protected override void PostProcessConfiguration(Configuration config)
    {
        base.PostProcessConfiguration(config);
        // snip ... guard methods omitted
        Assembly asm = GetAssembly(MyMappingAssembly);
        IEnumerable<string> paths = GetResourcePaths(MyFolder, asm);
        config.AddResources(paths, asm);
    }
    // snip ...
}
于 2012-09-11T12:41:48.860 回答