【问题标题】:Asp MVC problem configuring application with Windsor and NHibernate使用 Windsor 和 NHibernate 配置应用程序的 Asp MVC 问题
【发布时间】:2011-06-20 14:32:33
【问题描述】:

我在使用 Windsor、设施和 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() ;
    }
   ......
}

【问题讨论】:

  • 请完整的堆栈跟踪。
  • 在哪个执行点得到异常?
  • 我加载了我有搜索框的页面我尝试搜索一些东西,但我得到了这个异常。请注意,当我在会话中删除 LifeStyle.PerWebRequest 时一切正常(但我需要每个请求的会话)
  • 请正确格式化堆栈跟踪,它几乎不可读...

标签: c# nhibernate castle-windsor facilities


【解决方案1】:

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

这就是为什么大多数时候您不希望单例依赖于具有“较短”生命周期的其他组件(例如每个网络请求或瞬态)。

请参阅this article,了解对常见生活方式问题的更全面分析。

【讨论】:

  • 感谢现在有道理 +1
【解决方案2】:

我知道出了什么问题。我忘记将我的存储库生活方式配置为 Transient。不过我不太明白这是怎么回事。

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

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

【讨论】:

  • 这是一个问题,因为您的 ISession 是每个 Web 请求的,但在那之后您会保留您的 repo 很长时间。因此生活方式关闭了 ISession 但 repo 尝试使用它。
  • 我遇到了这个确切的问题。谢谢
猜你喜欢
  • 2011-06-27
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 2015-05-22
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多