从一些代码开始:
sessionFactory = Fluently.Configure(cfg)
.Mappings(m =>
{
List<Assembly> allAssemblies = new List<Assembly>();
string path = Assembly.GetExecutingAssembly().Location;
foreach (string dll in Directory.GetFiles(path, "*.dll"))
{
m.FluentMappings.AddFromAssembly(Assembly.LoadFile(dll));
}
})
.BuildSessionFactory();
我对nhibernate和流利的nhibernate都很新。上面的代码看起来应该可以工作,但对我来说它看起来真的很难看。有更简洁的方式吗?
我遇到的一个问题是,调用上述代码的代码位于核心程序集中,并且无法引用某些需要映射的程序集,因为它们的程序集引用了核心程序集。所以我不能只使用几次调用AddFromAssemblyOf<T>
。
有更简洁的方法吗?
答案 0 :(得分:2)
您应该从应用程序本身管理SessionFactory初始化,因此您的原始代码可以正常工作。
我通过创建一个NH配置基类来处理这个问题,该基类执行您最初尝试执行的操作。然后我从我的应用程序中升级它并在那里进行所有引导。
答案 1 :(得分:1)
您可以创建自定义配置节点以放入配置文件。
您将拥有以下内容:
<configSections>
<section name="fluentConfigurationsSection" type="MyCoreAssembly.FluentConfigurationsSection, MyCoreAssembly"/>
</configSections>
<fluentConfigurationsSection>
<fluentConfigurations>
<clear />
<add name="Assembly1" assembly="MyAssemblyNotReferencedByCoreAssembly.Mapping.Fluent"
<add name="Assembly2" assembly="AnotherAssemblyNotReferencedByCoreAssembly.Mapping.Fluent"
<add name="Assembly3" assembly="OneMoreAssemblyNotReferencedByCoreAssembly.Mapping.Fluent"
</fluentConfigurations>
</fluentConfigurationsSection>
然后您的代码可以更改为:
sessionFactory = Fluently.Configure(cfg)
.Mappings(m =>
{
foreach(var config in MethodToGetFluentConfigSectionItems())
{
//load each assembly in config file
m.FluentMappings.AddFromAssembly(Assembly.Load(config.Assembly);
}
})
.BuildSessionFactory();
要创建自定义配置部分,您可以看到here如何操作。
希望这有帮助。