2009-11-19 105 views
50

這是我的理解,對於一個控制器構造每個Web請求期間不叫。假設這是事實,控制器的生命週期是什麼? Is是在應用程序啓動時「構建」的,然後使用每個Web請求注入的requestcontext進行緩存和調用?ASP.NET MVC控制器生命週期

只是要清楚,我不問如何模擬構造函數的行爲,我用的是OnActionExecuting事件引發的事情,我會在構造函數通常做。另外,我還使用控制器上的構造函數進行單元和系統測試。

謝謝!

回答

74

如果使用default controller factory一個新的實例將建成爲每個請求,這就是事情應該是這樣。控制器不應該在不同的請求之間共享。你可以寫一個自定義工廠來管理控制器的生命週期。

+10

雖然爲什麼?爲什麼? – 2012-03-09 22:01:19

+2

我搞砸了,並教導自己爲什麼這樣,應該是這樣。我正在使用EF創建具有讀/寫操作和視圖的控制器。生成的代碼爲EF上下文實例創建了一個私有實例變量。我認爲我會很聰明,並使之成爲一個靜態變量。問題是,如果這個控制器範圍之外的東西修改了數據庫,靜態上下文永遠不會知道。現在我將它作爲一個實例變量保留下來,並且由於每個請求都創建了一個新實例,所以上下文可以看到數據庫的任何更改。 – ThatAintWorking 2013-06-19 18:38:33

+1

在Web API,所有的狀態包含的參數範圍內(即功能性風格)沒有理由(我可以看到),爲什麼控制器不能再被使用。它通過設計是線程安全的。 – 2013-09-19 09:10:15

10

我怕,你的理解是錯誤的。一個控制器(應該是一個非常輕薄的類,並且不能有任何會話退出狀態)實際上是爲每個Web請求而動態構建的。控制器實例如何才能針對某個視圖特定?

因此,有沒有這樣的事情作爲一個「生命週期」(比要求的除外)...創建

1

控制器爲每個請求你做。讓我們舉個例子。

public class ExampleController : Controller{ 
      public static userName; 

      public void Action1(){//do stuff} 
      public void Action2(){//do stuff} 
      public void AssignUserName(string username){ 
       userName = username; 

      } 
      public string GetName(){ return userName;} 


    } 

現在您可以通過傳遞用戶名的視圖調用控制器。不希望獲得您在下一個請求中設置的用戶名。它將返回null。因此,對於每個請求都會創建一個新的控制器您不需要在MVC中的任何位置實例化控制器,就像您從類中創建對象一樣。只要你沒有控制器對象的內存指針就可以像調用其他對象那樣調用它。

到這個鏈接。對MVC控制器的生命週期有很好的解釋。

ASP.Net MVC - Request Life Cycle