2013-08-21 61 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服務還必須按請求作用域。