0

我有以下的全球行動過濾器:NHibernate的會議結束在全球行動篩選

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

這工作第一細請求,但它會拋出一個錯誤,告訴我該會話已關閉。如果我將會話屬性更改爲以下內容:

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

它工作正常,但它似乎喜歡黑客。有沒有一種很好的方法在全局動作過濾器中注入依賴關係?

我會很感激的幫助。謝謝

回答

0

這樣做沒有問題,但請記住,如果您實例化一個全局過濾器,它會將一個實例添加到您的應用程序中。因此,您的代碼檢查_session對象是否爲空並對其進行實例化,但是當您關閉session時,您仍然有全局過濾器的參考,因爲它是單個實例,最差的是會話已關閉。所以,下一次訪問將得到一個非空對象和關閉會話。

我會讓DependencyResolver每次都給我會話的實例,因爲你在另一個層次上控制它(我想了解你正在爲每個請求做一個會話)。

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

而且asp.net mvc會爲每個請求都得到正確的實例。

+0

感謝這就是我想要的,但很高興有一些澄清。 – nfplee