为Web应用程序设置Fluent NHibernate和StructureMap

时间:2010-09-30 17:34:33

标签: fluent-nhibernate structuremap

我使用此approuch http://www.kevinwilliampang.com/2010/04/06/setting-up-asp-net-mvc-with-fluent-nhibernate-and-structuremap/来设置fnh with structuremap但在一次请求后我得到以下异常

会话已结束! 对象名称:'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>();
        });
    }
}

如何阻止会话被关闭?

1 个答案:

答案 0 :(得分:0)

您是否以与示例相同的方式注册您的ISession?应该像这样使用HttpContext:

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

另一种可能性是某些东西被注册为单身人士(并且持有一个封闭的会话,而不是在当前会话中重新创建。

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

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

public class MvcSiteMapProvider : SiteMapProvider { 
     public static IRepository Repository { get; set; }; 
     public MvcSiteMapProvider() { }
} 

protected void Application_BeginRequest() { 
     MvcSiteMapProvider.Repository = ObjectFactory.GetInstance<ISession>();
}