Fluent nhibernate 每个请求具有Funq和FuentNHibernate会话的ServiceStack
我试图在ServiceStack中使用FluentNHibernate,并在每个请求的会话基础上使用Funq IoC容器,我遇到了一个问题,在对我的服务的第二个请求中,我得到了一个ObjectDisposedException。Funq不应该为每个请求创建一个新会话吗 我的理解是,通过在Funq中使用ReusedWithin(ReuseScope.Request),每个请求都会得到一个新的ISession,但这只发生在第一个请求中。在我的AppHost中,我有以下内容:Fluent nhibernate 每个请求具有Funq和FuentNHibernate会话的ServiceStack,fluent-nhibernate,servicestack,funq,Fluent Nhibernate,servicestack,Funq,我试图在ServiceStack中使用FluentNHibernate,并在每个请求的会话基础上使用Funq IoC容器,我遇到了一个问题,在对我的服务的第二个请求中,我得到了一个ObjectDisposedException。Funq不应该为每个请求创建一个新会话吗 我的理解是,通过在Funq中使用ReusedWithin(ReuseScope.Request),每个请求都会得到一个新的ISession,但这只发生在第一个请求中。在我的AppHost中,我有以下内容: public stati
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();
}
公共静态NH.ISession当前会话
{
得到
{
SessionFactory=GetFactory();
NH.ISession session=SessionFactory.OpenSession();
返回会议;
}
}
私有静态NH.ISessionFactory GetFactory()
{
流畅地返回.Configure().Database(MsSqlConfiguration.MsSql2008
.ConnectionString(ConfigurationManager.ConnectionString[“DefaultConnection”].ConnectionString)).Mappings(m=>
{m.FluentMappings.AddFromAssemblyOf();})
.BuildSessionFactory();
}
以及在货柜上的登记:
container.Register<NH.ISession>(c => CurrentSession).ReusedWithin(Funq.ReuseScope.Request);
container.Register<ILog>(c => LogManager.GetLogger(GetType()));
container.Register(c=>CurrentSession.ReusedWithin(Funq.ReuseScope.Request);
container.Register(c=>LogManager.GetLogger(GetType());
所以我找到了我的问题所在。在Funq中为NHibernate ISession使用每个请求的请求作用域时,请确保依赖它的其他服务也在每个请求的作用域内,或者在下一个请求中处理它们的支持依赖项(本例中为ISession)。我将集装箱注册更改为以下内容:
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);
container.Register(c=>CurrentSession.ReusedWithin(Funq.ReuseScope.Request);
container.Register(c=>LogManager.GetLogger(GetType());
container.Register(c=>newservices.RequestService(c.Resolve(),c.Resolve()).ReusedWithin(Funq.ReuseScope.Request);
关键是请求服务还必须按请求确定作用域