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

Nhibernate 在运行时流畅地映射程序集/实体,nhibernate,reference,fluent-nhibernate,nhibernate-mapping,Nhibernate,Reference,Fluent Nhibernate,Nhibernate Mapping,简单的问题,我打赌答案不那么简单 想想像Wordpress这样的项目。Wordpress的基础非常好,开发人员构建它是为了通过小部件或插件等进行扩展 现在想想NHibernate,特别是Fluent映射 把它们放在一起,您就有了一个强大而稳定的“基本”系统,但是如何从外部程序集加载映射呢?我意识到系统必须使用反射动态加载程序集,但如何在第一次运行时流畅地配置nHibernate,以实现从这些程序集加载额外的实体?你如何引用它们 我知道你可以;t在配置完成后的运行时添加映射,那么您必须重新创建Se

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

想想像Wordpress这样的项目。Wordpress的基础非常好,开发人员构建它是为了通过小部件或插件等进行扩展

现在想想NHibernate,特别是Fluent映射

把它们放在一起,您就有了一个强大而稳定的“基本”系统,但是如何从外部程序集加载映射呢?我意识到系统必须使用反射动态加载程序集,但如何在第一次运行时流畅地配置nHibernate,以实现从这些程序集加载额外的实体?你如何引用它们

我知道你可以;t在配置完成后的运行时添加映射,那么您必须重新创建SessionFactory。这就是为什么我想在运行时加载所有必需的实体


我也知道,依赖性注射可以在一定程度上实现这一点,但我不希望走这条路,也不希望它带来极端的负担

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

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


谢谢您的帮助。

您可以流畅地将NHibernate配置对象传递给
。Configure()
。这样您就可以更新配置。正如您所说,当您这样做时,您需要重新创建会话工厂

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

Assembly.GetExportedTypes()
        .Any(x => x.IsClass
               && !x.IsAbstract
               && typeof(IMappingProvider).IsAssignabledFrom(type))
或类似)并添加部件。扫描所有程序集后,(重新)创建会话工厂


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

您可以将NHibernate配置对象流畅地传递到
。Configure()
。这样您就可以更新配置。正如您所说,当您这样做时,您需要重新创建会话工厂

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

Assembly.GetExportedTypes()
        .Any(x => x.IsClass
               && !x.IsAbstract
               && typeof(IMappingProvider).IsAssignabledFrom(type))
或类似)并添加部件。扫描所有程序集后,(重新)创建会话工厂


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

“随之而来的极端行李”我可以问一下您指的是什么极端行李吗?也许我可以帮助你更好地理解IoC容器。我当然想更好地理解它们。大多数的文档充其量是稀疏的,是为软件大师设计的,他们只是不知道;不要回到基本点,也不要遗漏需要的中间代码。我将不胜感激。我以前确实和Castle有过冲突,但我花了大约两天的时间才把它安装好并运行起来,因为文档不完整,结果发现我无法进一步使用Castle来完成我的预期项目。我确实了解它的jist以及为什么它非常有用,但我担心对于某些项目来说,这是过分的,但如果我能更好地理解它,我会另辟蹊径?也许我可以帮助你更好地理解IoC容器。我当然想更好地理解它们。大多数的文档充其量是稀疏的,是为软件大师设计的,他们只是不知道;不要回到基本点,也不要遗漏需要的中间代码。我将不胜感激。我以前确实和Castle有过冲突,但我花了大约两天的时间才把它安装好并运行起来,因为文档不完整,结果发现我无法进一步使用Castle来完成我的预期项目。我确实了解它的jist以及为什么它非常有用,但我担心对于某些项目来说,这是过分的,但是如果我能更好地理解它,我会想其他的。你能解释一下“NHibernate代码映射”是什么意思吗?这与Fluent类似吗?NHibernate3.2提供了一种内置的方法,可以使用代码而不是XML/属性映射类,并根据约定自动映射类。它的用途类似于FluentNHibernate,但是语法有点不同。我不会说它一定更好,但我想转移到NH3.2并减少外部依赖的数量。FNH有点落后于NH,目前只支持NH3.1(官方)。看,太好了,我不知道那里有。考虑到我只是从流利开始,我可能会研究它。我假设我的初始查询也可以像上面提到的那样以类似的方式完成?另外,在我的例子中,这是指从基础项目、web应用程序中完成,还是可以从“中间”程序集(例如数据访问程序集)中完成。很抱歉回答得太晚。我在应用程序启动期间注册所有映射(我主要做web应用程序)。对于更大的项目,我创建了一个专用的配置项目,其中包含了与配置相关的所有内容:扫描程序集以查找映射,为IoC容器注册模块等等。但是,在何处执行这些操作并不重要。只要它是一致的并且对你有意义。通常,我会以某种方式将其添加到应用程序中与持久性/数据访问相关的部分?这与Fluent类似吗?NHibernate3.2提供了一种内置的方法,可以使用代码而不是XML/属性映射类,并根据约定自动映射类。它的用途类似于FluentNHibernate,但是语法有点不同。我不会说它一定更好,但我想转移到NH3.2并减少外部de的数量