NHibernate会话在全局动作过滤器中关闭

时间:2014-04-23 15:48:27

标签: asp.net-mvc nhibernate dependency-injection action-filter

我有以下全局操作过滤器:

public class AddWidgetsAttribute : ActionFilterAttribute {
    private ISession _session;
    public ISession Session {
        get {
            if (_session == null)
                _session = DependencyResolver.Current.GetService<ISession>();
            return _session;
        }
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        filterContext.Controller.ViewBag.Widgets = Session.Query<Widget>().ToList();
    }
}

这是在Application_Start事件中添加过滤器的代码:

GlobalFilters.Filters.Add(new AddWidgetsAttribute());

这在第一个请求上工作正常但是它会抛出一个错误告诉我会话已关闭。如果我将Session属性更改为以下内容:

public ISession Session {
    get { return DependencyResolver.Current.GetService<ISession>(); }
}

它工作正常,但它看起来像是一个黑客。有没有一种很好的方法在全局动作过滤器中注入依赖?

我很感激帮助。感谢

1 个答案:

答案 0 :(得分:0)

执行此操作没有问题,但请记住,如果您实例化全局过滤器,它会在您的应用程序中添加一个实例。因此,您的代码检查_session对象是否为空并为其实例,但是,当您关闭session时,您仍然在全局过滤器上有引用,因为它是单个实例,而且最差,会议结束。因此,下一次访问将获得非空对象和关闭会话。

我会让DependencyResolver每次都给我一个会话实例,因为你在另一个级别控制它(我想知道你是在为每个请求做一个会话)。

public ISession Session 
{
   get 
   {
      return DependencyResolver.Current.GetService<ISession>();
   }
}

asp.net mvc将在每次请求时获得正确的实例。