自從我開始編寫經典的ASP 12(或多年前)以來,我就一直在探討這個問題,而且我從未找到一個好的解決方案,因爲ASP和ASP.NET的體系結構一直都是不好的做法沼澤,魔法共享單身等。我最大的問題是與HttpApplication
對象與其非事件事件(Application_Start
,Application_End
等)。Application_Start與OnInit與構造函數
如果你想在HTTP應用程序的整個生命週期內做一次東西,那麼Application_Start
是明顯的地方。對?不完全是。首先,這不是一個事件本身,它是一種神奇的命名約定,當遵循這個約定時,會爲每個由IIS創建的AppDomain調用該方法一次。
除了神奇的命名規則是一種可怕的做法,我開始認爲這可能是一個原因,在HttpApplication
對象上不存在Start
事件。所以我嘗試了一些確實存在的事件,例如Init
。那麼,這也不是一個真正的事件,它是一種可重複使用的方法,這是下一個最好的事情。
看起來,HttpApplication
對象的每個實例化都會調用Init()
方法,該方法發生的次數遠遠超過每個AppDomain一次。這意味着我不妨將我的啓動邏輯放在HttpApplication
對象的構造函數中。
現在我的問題是,爲什麼我不應該把我的啓動邏輯放在構造函數中?爲什麼連Init()
都存在,我需要關心Application_Start
?如果我這樣做,任何人都可以解釋爲什麼在HttpApplication
對象中沒有針對此僞事件的適當事件或可覆蓋的方法?
而且任何人都可以向我解釋爲什麼在一個典型的ASP.NET應用程序的8個實例我HttpApplication
創建(這會使構造和Init
運行同樣多的時間當然,這可以通過鎖定減輕和一個叫做initialized
的共享靜態布爾值),當我的應用程序只有一個AppDomain時?
可能需要在Application_Start中完成,以便框架可以設置所有這些魔術共享對象。也許這個類在這之前就被觸及了,靜態構造函數會運行得太早。 – 2014-05-02 20:20:51
@JoeKoberg,這是一個很好的觀點。當然,對靜態構造函數進行調用的時間比對顯式方法調用的控制要少。不過,我仍然沒有看到'Init()'的必要性。而'Application_Start'和'Application_End'應該仍然是正確的事件。 – 2014-05-05 08:44:51