如何在Structuremap.MVC5中按请求管理NHibernate会话

时间:2016-04-21 12:11:10

标签: c# asp.net-mvc nhibernate dependency-injection structuremap

我是IoC和NHibernate的新手,并且在尝试依赖注入的最佳实践方面遇到了很大的困难。我花了最近几天环顾四周并阅读文档,但遗憾的是我发现的文档已经过时或不完整。

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

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

如果我有这样的存储库

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

我如何做这项工作:

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

或者我是否以某种方式向后退了?

1 个答案:

答案 0 :(得分:0)

因此,事实证明这种行为是自动的 - 我不需要打开它。我做了一个无关的错误,并认为这是问题所在。有些不明确的文档并没有帮助它。 如果您使用的是structuremap.MVC5 nuget包:

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

这将导致structuremap每个httprequest打开一次会话。当然,你不应该在这里打开会话,因为有很多事情与你想要正确处理的交易,绑定和工作单元有关 - 但这是一个独立的NHibernate超出此问题范围的事情。