为应用程序中的所有程序集注册流畅的nhibernate映射

时间:2010-08-24 16:34:33

标签: nhibernate fluent-nhibernate

从一些代码开始:

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>

有更简洁的方法吗?

2 个答案:

答案 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如何操作。

希望这有帮助。