使用Windsor和NHibernate配置应用程序的Asp MVC问题

本文关键字:Asp MVC 问题 应用程序 配置 Windsor NHibernate 使用 | 更新日期: 2023-09-27 17:59:31

我在使用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() ;
    }
   ......
}

使用Windsor和NHibernate配置应用程序的Asp MVC问题

如果您的Repository<T>在其构造函数中获得了一个ISession,并且它是singleton(默认生活方式),那么它将只在您调用存储库的第一个请求中工作。在随后的请求中,存储库仍将具有与第一次调用中相同的ISession(因为存储库是singleton),但该会话现在已关闭,无法使用,因此会出现错误。

这就是为什么大多数时候你不希望单例依赖于其他生活方式"更短"的组件(比如每个web请求或瞬态)。

有关常见生活方式问题的更深入分析,请参阅本文。

我发现了问题所在。我忘记将我的存储库生活方式配置为Transient。我不太明白这怎么会是个问题。

            container.Register(Component.For(typeof(IRepository<>))
                                    .ImplementedBy(typeof(Repository<>)).LifeStyle.Transient);

我想知道默认的生活方式是什么?我在文档中读到它是singleton?!这怎么会是个问题?