2013-08-21 23 views
2

我想在ServiceStack在会话每个请求使用FluentNHibernate与Funq IoC容器,我在第二个请求,我的服务,而运行到一个问题,我得到的ObjectDisposedException。不应该Funq为每个请求创建一个新的会话?ServiceStack随着Funq和FuentNHibernate Sesssion每个请求

我的理解是,通过在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())); 

回答

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

关键是Request服务还必须按请求作用域。