Fluent nhibernate 为web应用程序设置Fluent NHibernate和StructureMap

Fluent nhibernate 为web应用程序设置Fluent NHibernate和StructureMap,fluent-nhibernate,structuremap,Fluent Nhibernate,Structuremap,我使用这种方法设置带有structuremap的fnh,但是在一个请求之后,我得到了以下异常 会议结束了! 对象名称:“ISession” 描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源 异常详细信息:System.ObjectDisposedException:会话已关闭! 对象名称:“ISession” 我的存储库类如下所示: public class Repository : IRepository { private r

我使用这种方法设置带有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>();
        });
    }
}
我在structuremap中注册我的存储库,如下所示:

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>();
        });
    }
}

如何防止会话关闭?

您是否以与示例中相同的方式注册ISession?它的作用域应为HttpContext,如下所示:

      x.For<ISession>()
        .HttpContextScoped()
        .Use(context => context.GetInstance<ISessionFactory>().OpenSession());
另一种可能性是,某些内容正在注册为单例,并保留在关闭的会话中,而不是使用当前会话重新创建

在StructureMap列表上看到您的问题后,我看到了问题

您正在将您的存储库注入到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.WhatDihave的输出,看看是否所有内容都正确注册。某些内容的作用域一定有误,或者您正在某个位置显式关闭会话。此错误似乎发生在my sitemapprovider中。因为构造函数必须有一个空的默认构造函数,所以我在构造函数中使用ObjectFactory.GetInstance,这似乎就是问题所在?公共类MvcSiteMapProvider:SiteMapProvider{private IRepository}存储库;公共MvcSiteMapProvider{u存储库=ObjectFactory.GetInstance;}}