在运行时流畅地映射程序集/实体

时间:2012-02-29 19:44:33

标签: nhibernate reference fluent-nhibernate nhibernate-mapping

简单的问题,我打赌一个不那么简单的答案。

想想像Wordpress这样的项目。 Wordpress的基础非常棒,开发人员将其构建为使用小部件或插件等进行扩展。

现在想想NHibernate,特别是Fluent Mappings。

将它们组合在一起,您就拥有了一个强大而稳定的“基础”系统但是如何加载外部组件提供的映射?我意识到系统必须使用反射动态加载Assemblies,但是如何在第一次运行时配置nHibernate,Fluently以实现从这些程序集中加载额外的实体?你怎么引用它们?

我知道你可以;在配置完成后在运行时添加Mappings,你必须重新创建SessionFactory。这就是我想在运行时加载所有必需实体的原因。

我也知道这可以通过Dependancy Injection来实现,但我不希望走那条路,也不想要随之而来的极端行李。

如果可以修改普通的旧nHiberante配置文件,然后在运行时引用它以反映新的实体,我只能假设必须有一种方法可以流畅地完成它。

此外,根据答案:您是从基础项目还是数据访问程序集进行配置?

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

您可以将NHibernate配置对象传递给Fluently.Configure()。这样您就可以更新配置。当你这样做时,你需要重新创建会话工厂,就像你说的那样。

您可以在bin文件夹中扫描包含流畅映射类(Assembly.Load的程序集的程序集,然后检查

Assembly.GetExportedTypes()
        .Any(x => x.IsClass
               && !x.IsAbstract
               && typeof(IMappingProvider).IsAssignabledFrom(type))

或类似的)并添加程序集。扫描完所有装配后,(重新)创建会话工厂。

我在我编写的可扩展应用程序框架中做了类似的事情(虽然我已经从Fluent NHibernate转移到NHibernate映射代码,但原理类似)。