我有一個ASP.NET 2 C#應用程序,它使用Singleton從數據庫中加載大量數據。構建後如何自動實例化單例?
這個單例的第一個請求很慢(如預期)。其後的速度非常快。無論如何,只要項目建立就實例化單身人士?
我有一個ASP.NET 2 C#應用程序,它使用Singleton從數據庫中加載大量數據。構建後如何自動實例化單例?
這個單例的第一個請求很慢(如預期)。其後的速度非常快。無論如何,只要項目建立就實例化單身人士?
在沒有運行實際應用程序的情況下,沒有辦法從數據庫中直接填充單例。您可以通過將單例填充到來自應用程序其餘部分的單獨線程中(在Application_Start
中)來加速它,但是如果在完全加載之前使用單例(並且還需要添加的鎖定邏輯)。
是否有一個特定的原因,你爲什麼要從數據庫中加載大量數據到單例中?
將它創建爲具有WebActivator的App_Start配置類。
假設您的應用程序設置爲虛擬目錄,App_Start中的代碼將在構建後立即調用。
請注意,這會讓你覺得你的版本「很慢」。另外請注意,如果你的代碼中得到一個異常,你會真正得到一個「構建失敗」類似於一個神祕的錯誤消息:
Exception has been thrown by the target of an invocation.. ASPRUNTIME ProjectName
這意味着你需要瀏覽到您的應用程序在瀏覽器看到真實的錯誤信息。
當我們將EF Migrations綁定到App_Start配置中時,我們遇到了這一切。
App_Start代碼不作爲構建的一部分運行,它在應用程序啓動時運行。如果您使用開發Web服務器(並打開它),那麼它可能在重建時自動啓動應用程序,但我沒有對其進行測試。 –
你可能把代碼填入global.asax.cs中Application_Start
方法中的單例。
從MSDN:
請求在ASP.NET應用程序中的第一資源(如網頁)時調用。 Application_Start方法在應用程序的生命週期中只調用一次。您可以使用此方法執行啓動任務,例如將數據加載到緩存中並初始化靜態值。
-1那裏肯定是一種方式,請參閱我的答案。 –
@ChrisMarisic「無需運行應用程序」 - WebActivator不會繞過此限制,仍然需要啓動應用程序。 –
如果App_Start中的代碼拋出異常,WebActivator的使用情況如何導致Visual Studio輸出「構建失敗」? –