C# 将(Fluent)NHibernate与StructureMap(或任何IoCC)一起使用

C# 将(Fluent)NHibernate与StructureMap(或任何IoCC)一起使用,c#,nhibernate,fluent-nhibernate,structuremap,C#,Nhibernate,Fluent Nhibernate,Structuremap,在我寻求学习NHibernate的过程中,我已经达到了下一个障碍;我应该如何将其与StructureMap集成 虽然代码示例非常受欢迎,但我对一般过程更感兴趣 我计划做的是 使用Fluent NHibernate创建我的类映射,以便在NHibs配置中使用 执行ISession和ISessionFactory 将ISessionFactory的实例作为单例引导到StructureMap中 使用每个HttpRequest缓存向StructureMap注册ISession 然而,我不需要在Http

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

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

我计划做的是

  • 使用Fluent NHibernate创建我的类映射,以便在NHibs配置中使用
  • 执行ISession和ISessionFactory
  • 将ISessionFactory的实例作为单例引导到StructureMap中
  • 使用每个HttpRequest缓存向StructureMap注册ISession
然而,我不需要在HttpRequest结束时调用会话实例上的各种整理方法吗(因为这是它生命的结束)

如果我在Dispose()中进行整理,structuremap会帮我处理吗

如果没有,我该怎么办

谢谢


Andrew

我没有使用结构图,但maybee我仍然可以帮助您指引正确的方向。与hbm文件相比,Fluent nHibernate是一个不错的选择

至于http请求,您不需要确保在http请求结束时关闭会话。如果你不这样做,你最终会泄露nHibernate会话。我不确定structure map是否能为您处理这个问题,我所做的是我有一个http模块,它可以关闭会话


但需要注意的一点是,您将确保将所有数据访问包装在一个事务中,并确保nHibernate实际提交其更改。如果在会话结束时执行此操作,则可能会错过处理错误的机会。我很想知道你最终要做什么才能让这个工作正常。

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

您的总体策略听起来是正确的(除非您不会制作自己的会话或SessionFactory,正如在评论中已经指出的那样)。有关详细信息,请从以下位置获取我的配置代码:

这篇文章实际上是关于集成NH Validator和Fluent NHibernate的,但是你可以在文章的“奖金”部分看到我是如何用StructureMap注册会话工厂和ISession的

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


会话工厂是一个非常昂贵的对象,您只需要初始化一次,并在应用程序的整个生命周期内保留它。

在第二点中,您提到了实现ISessionFactory和ISession。您不想自己实现这些。您可能希望实现某种“管理器”,使您能够访问ISessionFactory和打开/关闭会话。那么,它们是否已经在NHib中实现了?它们在什么名称空间中?它们在NHibernate.Impl名称空间中,但您可以通过Configuration.BuildSessionFactory()和iseSessionFactory.OpenSession()访问它们。上面的链接已断开,应该是谢谢,我修复了答案中的链接。