【问题标题】:Setting up Fluent NHibernate and StructureMap for a web application为 Web 应用程序设置 Fluent NHibernate 和 StructureMap
【发布时间】:2010-09-30 17:34:33
【问题描述】:

我使用这个 approuch http://www.kevinwilliampang.com/2010/04/06/setting-up-asp-net-mvc-with-fluent-nhibernate-and-structuremap/ 来设置带有结构映射的 fnh,但是在一个请求之后我得到以下异常

会话已关闭! 对象名称:'ISession'。

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.ObjectDisposedException:会话已关闭! 对象名称:'ISession'。

我的存储库类如下所示:

public class Repository : IRepository {
    private readonly ISession _session;
    public Repository(ISession session) {
        _session = session;
    }
    public T Get<T>(Expression<Func<T, bool>> predicate) {
        return _session.CreateCriteria(typeof(T)).Add(predicate).UniqueResult<T>();
    }

我在结构图中注册我的存储库,如下所示:

public class RepositoryRegistry : Registry {
    public RepositoryRegistry() {
        Scan(a => {
            a.AssembliesFromApplicationBaseDirectory();
            a.AddAllTypesOf<IRepository>();
        });
    }
}

如何防止会话被关闭?

【问题讨论】:

    标签: fluent-nhibernate structuremap


    【解决方案1】:

    您是否以与示例中相同的方式注册您的 ISession?它的 HttpContext 范围应该是这样的:

          x.For<ISession>()
            .HttpContextScoped()
            .Use(context => context.GetInstance<ISessionFactory>().OpenSession());
    

    另一种可能性是某些东西被注册为单例(并保持关闭的会话,而不是使用当前会话重新创建。

    在 StructureMap 列表中看到您的问题后:http://groups.google.com/group/structuremap-users/browse_thread/thread/8023e0acc43ceeb3#,我看到了问题。

    您正在将存储库注入到站点地图中,这是一个单例。因此,您需要为 SiteMap 的每个请求提供一个新会话,如下所示:

    public class MvcSiteMapProvider : SiteMapProvider { 
         public static IRepository Repository { get; set; }; 
         public MvcSiteMapProvider() { }
    } 
    
    protected void Application_BeginRequest() { 
         MvcSiteMapProvider.Repository = ObjectFactory.GetInstance<ISession>();
    }
    

    【讨论】:

    • 没错,ISession 的注册看起来就是这样。唯一注册为 Singleton 的是 ISessionFactory,尽管它就像在示例中一样。你知道我可以从哪里开始搜索错误吗?
    • 嗯,这很奇怪,您可以查看 ObjectFactory.WhatDoIHave() 的输出,看看是否一切看起来都已正确注册。一定是范围错误,或者您在某处明确关闭会话。
    • 这个错误似乎发生在我的站点地图提供者中。因为构造函数必须有一个空的默认构造函数,所以我在构造函数中使用 ObjectFactory.GetInstance() ,这似乎是问题所在?公共类 MvcSiteMapProvider : SiteMapProvider { 私有 IRepository _repository;公共 MvcSiteMapProvider() { _repository = ObjectFactory.GetInstance(); } }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    相关资源
    最近更新 更多