2011-11-16 46 views
2

我有一個ASP.NET 2 C#應用程序,它使用Singleton從數據庫中加載大量數據。構建後如何自動實例化單例?

這個單例的第一個請求很慢(如預期)。其後的速度非常快。無論如何,只要項目建立就實例化單身人士?

回答

0

在沒有運行實際應用程序的情況下,沒有辦法從數據庫中直接填充單例。您可以通過將單例填充到來自應用程序其餘部分的單獨線程中(在Application_Start中)來加速它,但是如果在完全加載之前使用單例(並且還需要添加的鎖定邏輯)。

是否有一個特定的原因,你爲什麼要從數據庫中加載大量數據到單例中?

+0

-1那裏肯定是一種方式,請參閱我的答案。 –

+0

@ChrisMarisic「無需運行應用程序」 - WebActivator不會繞過此限制,仍然需要啓動應用程序。 –

+0

如果App_Start中的代碼拋出異常,WebActivator的使用情況如何導致Visual Studio輸出「構建失敗」? –

-2

將它創建爲具有WebActivator的App_Start配置類。

假設您的應用程序設置爲虛擬目錄,App_Start中的代碼將在構建後立即調用。

請注意,這會讓你覺得你的版本「很慢」。另外請注意,如果你的代碼中得到一個異常,你會真正得到一個「構建失敗」類似於一個神祕的錯誤消息:

Exception has been thrown by the target of an invocation.. ASPRUNTIME ProjectName

這意味着你需要瀏覽到您的應用程序在瀏覽器看到真實的錯誤信息。

當我們將EF Migrations綁定到App_Start配置中時,我們遇到了這一切。

+0

App_Start代碼不作爲構建的一部分運行,它在應用程序啓動時運行。如果您使用開發Web服務器(並打開它),那麼它可能在重建時自動啓動應用程序,但我沒有對其進行測試。 –

0

可能把代碼填入global.asax.cs中Application_Start方法中的單例。

MSDN

請求在ASP.NET應用程序中的第一資源(如網頁)時調用。 Application_Start方法在應用程序的生命週期中只調用一次。您可以使用此方法執行啓動任務,例如將數據加載到緩存中並初始化靜態值。