C# Asp MVC使用Windsor和NHibernate配置应用程序时出现问题
我在使用windsor、facilities和nhibernate配置应用程序时遇到问题 我得到了这个例外:C# Asp MVC使用Windsor和NHibernate配置应用程序时出现问题,c#,nhibernate,castle-windsor,facilities,C#,Nhibernate,Castle Windsor,Facilities,我在使用windsor、facilities和nhibernate配置应用程序时遇到问题 我得到了这个例外: ObjectDisposedException: Session is closed windsor是否应该根据请求实例化会话,并在我有这样的配置时打开会话?我会错过一些配置吗? 以下是我的困惑: public class PersistenceFacility : AbstractFacility { protected override void Init()
ObjectDisposedException: Session is closed
windsor是否应该根据请求实例化会话,并在我有这样的配置时打开会话?我会错过一些配置吗?
以下是我的困惑:
public class PersistenceFacility : AbstractFacility
{
protected override void Init()
{
Configuration config = BuildDatabaseConfiguration();
Kernel.Register(
Component.For<ISessionFactory>()
.LifeStyle.Singleton
.UsingFactoryMethod(config.BuildSessionFactory),
Component.For<ISession>()
.LifeStyle.PerWebRequest
.UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession()));
}
private Configuration BuildDatabaseConfiguration()
{
return Fluently.Configure()
.Database(SetupDatabase)
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<RnUlice>())
.ExposeConfiguration(ConfigurePersistence)
.BuildConfiguration() ;
}
......
}
公共类PersistenceFacility:AbstractFacility
{
受保护的重写void Init()
{
Configuration config=BuildDatabaseConfiguration();
内核寄存器(
用于()的组件
.单身汉
.UsingFactoryMethod(config.BuildSessionFactory),
用于()的组件
.livelope.PerWebRequest
.UsingFactoryMethod(k=>k.Resolve().OpenSession());
}
私有配置BuildDatabaseConfiguration()
{
流畅地返回。Configure()
.数据库(设置数据库)
.Mappings(m=>m.FluentMappings.AddFromAssemblyOf())
.ExposeConfiguration(配置持久性)
.BuildConfiguration();
}
......
}
我发现了问题所在。我忘记将我的存储库生活方式配置为瞬态。我不太明白这是个什么问题
container.Register(Component.For(typeof(IRepository<>))
.ImplementedBy(typeof(Repository<>)).LifeStyle.Transient);
container.Register(Component.For(typeof(IRepository))
.ImplementedBy(typeof(Repository)).lifesture.Transient);
我想知道默认的生活方式是什么?我在文件里读到是辛格尔顿?!这怎么可能是个问题呢?如果您的存储库在其构造函数中获得ISession,并且它是singleton(默认生活方式),那么它将只在您调用存储库的第一个请求中工作。在随后的请求中,存储库仍将具有与第一次调用中相同的ISession(因为存储库是单例的),但该会话现在已关闭,无法使用,因此您会看到错误
这就是为什么大多数时候你不想让一个单身依赖于其他组件的“更短”的生活方式(比如每个web请求或瞬态)
有关常见生活方式问题的更全面的分析,请参阅。请使用完整堆栈跟踪。在哪个执行点会出现异常?我加载了“我有搜索框”的页面,我尝试搜索某个内容,然后出现此异常。注意:当我删除会话上的liveloper.PerWebRequest时,一切都正常(但我需要每个请求的会话)请正确格式化堆栈跟踪,它几乎不可读…这是一个问题,因为您的会话是每个web请求的,但在此之后,您会保留很长时间的repo。因此,生活方式关闭了ISession,但回购试图使用它。我有一个确切的问题。谢谢你现在有意义了+1