我使用此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>();
});
}
}
如何阻止会话被关闭?
答案 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>();
}