簡體   English   中英

用於創建Web服務的Singleton模式,但如何處理。

[英]Singleton pattern used to create web service but what about dispose.

我已經使用單例模式創建了在win窗體應用程序中使用的Web服務的單個實例。 我已經看到,這是Web應用程序的良好做法。 我想知道Winform應用程序是否也一樣? 另外,我是否應該擔心處置Web服務(即之后的代理對象)的問題-它具有.Dispose方法,但是我沒有在代碼中的任何地方調用它。 在我的應用程序中,我異步調用所有Web方法。 這聽起來可能很愚蠢,但是我不知道該在哪里調用Dispose。 有人可以幫忙嗎?

class ListService
{
    private static RetrieveList s_proxy;

    private static readonly object s_lock = new object();

    private static readonly string s_webServiceURL = Authentication.RetrieveListUrl;

    internal static RetrieveList Proxy
    {
        get
        {
            lock (s_lock)
            {
                if (s_proxy == null)
                {
                    s_proxy = new RetrieveList();
                    s_proxy.Url = s_webServiceURL;
                }

                return s_proxy;
            }
        }
    }

}

如果應用程序只有一個實例,則在應用程序關閉或崩潰時,該對象將被銷毀。 您可以在終結器中調用Dispose,但這不能保證成功。

我會說,除非Dispose做一些至關重要的事情,例如保存您的文檔(不應該這樣做),否則請不要擔心太多。 它是單身的事實意味着它可以永久存在,而處置僅是為了釋放原本可以保留的資源。 該對象仍然存在,因此沒有釋放的空間。

但是,有些人可能會對此皺眉,然后說:“如果Dispose除了釋放資源,對我來說很重要的事情會怎樣?”。 您的應用程序運行后,您仍然可以調用Dispose:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new LogAnalizzer());
    ListService.Dispose();   // or whatever you're going to call it
}

我已經看到,這是Web應用程序的良好做法。 我想知道Winform應用程序是否也一樣?

根據經驗,當您的應用程序整體上只需要一個實例時,通常(線程安全)單例是一個好主意:緩存,與數據庫的連接,代理,應用程序本身,記錄器。 沒有什么可以說單例也不應該應用於您的WinForm應用程序。

但是請記住,您必須仔細考慮您的設計。 如果您有記錄器,但文件無法訪問怎么辦? 如果代理失去連接怎么辦? 等等

不確定C#是如何做到的,但是在Java中,您需要創建一個私有構造函數以防止人們執行new ListService()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM