如何在 Structuremap.MVC5 中管理每个请求的 NHibernate 会话

How to manage NHibernate Sessions per request in Structuremap.MVC5

我是 IoC 和 NHibernate 的新手,在尝试了解依赖项注入的最佳实践时遇到了很多困难。在过去的几天里,我一直在四处查看和阅读文档,但不幸的是,我发现的文档已经过时或不完整。

例如,这告诉我该做什么,但我不知道该怎么做。 XSockets.Net - how to manage NHibernate Session Context

我了解到,根据 official documentation,我需要在 structuremap 中使用嵌套容器来确保为每个请求创建和适当处理会话。不幸的是,这些示例都是在构建自己容器的单元测试中设置的。我不知道如何将其应用于 MVC。

如果我有这样的存储库

public class Repository : IRepository {    
    public Repository(ISession session) {
        ...
    }
    ...
}

如何进行这项工作:

public NHibernateRegistry()    
{
    ISessionFactory factory = config.BuildSessionFactory();
    For<IRepository>.Use<Repository>()
    For<ISession>.????????
}

或者我是否以某种方式完全倒退了?

所以,事实证明此行为是自动的 - 我不需要将其打开。我犯了一个不相关的错误,并认为这就是问题所在。有些不清楚的文档对它没有帮助。 如果您使用的是 structuremap.MVC5 nuget 包,那么:

SessionFactory _factory;
public NHibernateRegistry()    
{
    _factory = config.BuildSessionFactory();
    For<IRepository>.Use<Repository>()
    For<ISession>.Use(() => _factory.OpenSession());
}

这将导致 structuremap 在每个 httprequest 中打开一个会话。当然,你不应该在这里打开会话,因为有很多与事务、绑定和工作单元相关的事情你会想要正确处理——但这是一个单独的 NHibernate 事情,超出了这个问题。