首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每个请求具有Funq和FuentNHibernate会话的ServiceStack

每个请求具有Funq和FuentNHibernate会话的ServiceStack
EN

Stack Overflow用户
提问于 2013-08-22 05:24:15
回答 1查看 385关注 0票数 2

我尝试使用ServiceStack中的FluentNHibernate和Funq IoC容器的每个请求进行会话,但我遇到了一个问题,在对我的服务的第二个请求时,我得到了一个ObjectDisposedException。Funq不应该为每个请求创建一个新的会话吗?

我的理解是,通过在Funq中使用ReusedWithin(ReuseScope.Request),每个请求都将获得一个新的ISession,但这只发生在第一个请求中。在我的AppHost中,我有以下内容:

代码语言:javascript
复制
public static NH.ISession CurrentSession
    {
        get
        {
            SessionFactory = GetFactory();
            NH.ISession session = SessionFactory.OpenSession();
            return session;
        }
    }

    private static NH.ISessionFactory GetFactory()
    {
        return Fluently.Configure().Database(MsSqlConfiguration.MsSql2008
            .ConnectionString(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString)).Mappings(m =>
            { m.FluentMappings.AddFromAssemblyOf<Case>(); })
            .BuildSessionFactory(); 
    }

以及与容器的注册:

代码语言:javascript
复制
            container.Register<NH.ISession>(c => CurrentSession).ReusedWithin(Funq.ReuseScope.Request);
            container.Register<ILog>(c => LogManager.GetLogger(GetType()));  
EN

回答 1

Stack Overflow用户

发布于 2013-08-22 06:15:36

所以我找到了我的问题所在。当在Funq中为NHibernate ISession使用每个请求的请求作用域时,请确保依赖它的其他服务也是每个请求的作用域,否则它们的支持依赖项(在本例中为ISesssion)将在下一个请求时被释放。我将容器注册更改为以下内容:

代码语言:javascript
复制
container.Register<NH.ISession>(c => CurrentSession).ReusedWithin(Funq.ReuseScope.Request);
            container.Register<ILog>(c => LogManager.GetLogger(GetType()));
            container.Register<IRequestService>(c => new Services.RequestService(c.Resolve<NH.ISession>(), c.Resolve<ILog>())).ReusedWithin(Funq.ReuseScope.Request);

关键是请求服务还必须针对每个请求确定作用域。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18367961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档