NHibernate + MVC5 + StructureMap UniquePerRequestLifecycle

时间:2016-03-09 08:32:18

标签: nhibernate asp.net-mvc-5 structuremap

我将上述框架用于负载很重的Web应用程序。

但是,在进行SoapUI负载测试时,我在执行简单的数据库操作(例如通过用户名获取用户)时发现了几种类型的错误,例如:

  

ExecuteReader需要一个开放且可用的连接。连接的当前状态已关闭。

我的配置如下:

DataAccessRegistry.cs:

        For<ISessionFactory>().Singleton().Use(_ => ConfigureSessionFactory());

        For<ISession>()
            .LifecycleIs(new UniquePerRequestLifecycle()) // one session per request pattern
            .Use(ctx => ctx.GetInstance<ISessionFactory>().OpenSession());

ControllerConvention.cs:

    public void ScanTypes(TypeSet types, Registry registry)
    {
        foreach (var type in types.FindTypes(TypeClassification.Concretes).Where(type => type.CanBeCastTo<Controller>()))
        {
            registry.For(type).LifecycleIs(new UniquePerRequestLifecycle());
        };
    }

StructureMapScopeModule.cs:

    public void Init(HttpApplication context) {
        context.BeginRequest += (sender, e) =>
        {
            StructuremapMvc.StructureMapDependencyScope.CreateNestedContainer();
        };
        context.EndRequest += (sender, e) => {
            var session = StructuremapMvc.StructureMapDependencyScope.CurrentNestedContainer.GetInstance<ISession>();
            if (session.IsOpen) {
                session.Flush(); // RLE: make sure everything is flushed to the DB before the HTTP request/context finishes as otherwise all writes seem to be lost
                session.Close();
                session.Dispose();
            }
            HttpContextLifecycle.DisposeAndClearAll();
            StructuremapMvc.StructureMapDependencyScope.DisposeNestedContainer();
        };
    }

添加其他日志记录时,我注意到structmap将相同的Session注入多个控制器和请求: http://pastebin.com/mU7u67nP

因此,由于一个请求在另一个请求尝试使用之前关闭会话,整个事情就会分崩离析。

我已尝试过所有可能的不同生命周期,例如AlwaysUniqueTransient等,但它无法正常工作。

我是否错误地配置StructureMap或者还有其他什么?

0 个答案:

没有答案