有没有办法从会话工厂对象定义中排除某些hbm映射文件?

时间:2012-09-11 09:13:14

标签: nhibernate mapping spring.net

我已经构建了一个基于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文件分成几个程序集。

1 个答案:

答案 0 :(得分:0)

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

话虽如此,您可以实现自己的SessionFactoryObject继承自LocalSessionFactoryObject,它接受​​程序集和(例如)命名空间或文件夹来加载程序集。有关如何使用自定义配置创建自己的SessionFactoryObject的示例,您可以查看at Benny Michielsen's one for 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 ...
}