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