使用(流利)NHibernate与StructureMap(或任何IoCC)

在我学习NHibernate的过程中,我已经达到了下一个障碍; 我该如何将它与StructureMap集成?

虽然代码示例非常受欢迎,但我对一般过程更感兴趣。

我打算做的是……

  • 使用Fluent NHibernate创建我的类映射以用于NHibs配置
  • 实现ISession和ISessionFactory
  • 将我的ISessionFactory实例作为单例引导到StructureMap中
  • 使用StructureMap注册ISession,使用per-HttpRequest缓存

但是,我不需要在HttpRequest结束时在我的会话实例上调用各种整理方法(因为这就是生命的终点)?

如果我在Dispose()中进行整理,那么structuremap会为我处理这个问题吗?

如果没有,我该怎么办?

谢谢

安德鲁

我在我当前的3个项目中使用了StructureMap和fluent-nhibernate(以及NH Validator)。 其中2个是ASP MVC应用程序,第三个是WCF Web服务。

您的一般策略听起来是正确的(除非您不会制作自己的Session或SessionFactory,正如评论中已经指出的那样)。 有关详细信息,请从此处获取配置代码:

http://brendanjerwin.github.com/development/dotnet/2009/03/11/using-nhibernate-validator-with-fluent-nhibernate.html

post实际上是关于集成NH Validator和Fluent-NHibernate,但你可以看到我在post的“Bonus”部分中如何注册会话工厂和ISession与StructureMap。

RE:整理:您应该尝试并始终在事务中工作,并在您的工作单元结束时提交或回滚事务。 NH仅在需要时使用SQL Connections,并将为您清理有限的资源。 正常的垃圾收集将自己处理您的会话。

会话工厂是一个非常昂贵的对象,您只需初始化一次并在应用程序的生命周期中保持不变。

我没有使用结构图,但也许我仍然可以帮助指导您正确的方向。 流畅的nHibernate是hbm文件的绝佳选择。

对于http请求,您无需确保在http请求结束时关闭会话。 如果你不这样做,你最终会泄漏nHibernate会话。 我不确定结构图是否会为你处理这个,我所做的是我有一个关闭会话的http模块。

有一点要注意,虽然咬我,是你要确保你在事务中包装所有数据访问并确保nHibernate实际提交其更改。 如果您在会话结束时执行此操作,则可能会错过处理错误的机会。 我很想知道你为了达到这个标准而必须做些什么。