2010-09-28 177 views
10

我有一個使用某些配置設置的擴展方法。我宣佈這些爲static.NET中靜態變量的生存期

public static class Extensions 
{ 
    static string _mailServer = ConfigurationManager.AppSettings["MailServer"]; 
    // ... etc  

    public static void SendEmailConfirmation(this IOrder order) { } 
} 

我只是想檢查一下這是做什麼我打算,因爲我不是100%確定。我的想法是,我不希望繼續閱讀這些值,我希望它們被讀取一次並在Web應用程序的生命週期中緩存。這會發生什麼?由於

+1

我不會從擴展方法的配置讀取。您的擴展方法應該適用於所有的IOrders,但您的擴展方法只適用於正確配置的應用程序中的IOrders。 – 2010-09-28 15:54:53

+0

嗯,我想不出如何去做。通知服務不是域模型的真正組成部分,即發送電子郵件不應該是IOrder(基本上只包含訂單數據)的責任。所以我寫了一些擴展,當我想發送訂單狀態更改的通知時,我的控制器會調用這些擴展。你認爲這種說法有道理嗎?或者會有更好的方法? – fearofawhackplanet 2010-09-28 15:57:09

+0

發送電子郵件通常是企業中的一個交叉問題。我會創建一個服務,其唯一目的是發送電子郵件。您可以針對您發送的特定電子郵件設定特定方法,但我絕對會將發送電子郵件的部分隔離開。 – 2010-09-28 16:02:43

回答

15

(更新與KeithS的澄清,他們沒有讀過,直到第一次使用)

他們將被讀取它們所使用的第一時間,然後一直保持到應用程序域停止或回收,這可能是什麼你要。

也就是說,ASP.NET應用程序在AppDomain中運行。這就是它們如何駐留並可用於多個請求,而無需爲每個單獨的請求啓動。您可以配置它們的存活時間和回收時間等。靜態變量與應用程序一起生存並死亡,因此只要應用程序駐留在應用程序域中就會存活。

+0

很酷,謝謝。 (有史以來最簡單的代表:) :) – fearofawhackplanet 2010-09-28 15:53:01

+3

是的,直到十幾個人進來澄清所有的邊緣情況下,這不是100%真實...;) – 2010-09-28 15:54:13

+3

基本上這個。更具體地說,當首次需要靜態評估時,靜態評估會被延遲評估。這節省了初始化一堆靜態圖的啓動成本。因此,第一次運行SendEmailConfirmation()時,它將訪問應用程序設置,並將在應用程序域的生命週期中持久保存它(它將一直運行,直到應用程序池或IIS被重置爲止;第一次會不時自動發生,另一個通過用戶選擇或在服務器重啓時發生) – KeithS 2010-09-28 15:55:47

1

_mailServer將在第一次使用擴展類(以任何方式)時被初始化。在應用程序域重新加載之前,它不會再被設置。

1

他們會在第一次需要時加載,然後留在內存中,直到IIS回收應用程序。