2

我正在尝试在每个请求的会话基础上将 ServiceStack 中的 FluentNHibernate 与 Funq IoC 容器一起使用,我遇到了一个问题,即在对我的服务进行第二次请求时,我得到一个 ObjectDisposedException。Funq 不应该为每个请求创建一个新的 Session 吗?

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

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(); 
    }

以及与容器的注册:

            container.Register<NH.ISession>(c => CurrentSession).ReusedWithin(Funq.ReuseScope.Request);
            container.Register<ILog>(c => LogManager.GetLogger(GetType()));  
4

1 回答 1

6

所以我弄清楚我的问题是什么。当在 Funq 中为 NHibernate ISession 使用每个请求的请求范围时,请确保依赖它的其他服务也是每个请求的范围,或者它们的支持依赖项(在这种情况下为 ISesssion)将在下一个请求时处理。我将容器注册更改为以下内容:

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);

关键是请求服务还必须针对每个请求进行限定。

于 2013-08-21T22:15:35.783 回答