C# Asp MVC使用Windsor和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()

我在使用windsor、facilities和nhibernate配置应用程序时遇到问题

我得到了这个例外:

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