Singleton模式用于创建Web服务但是如何处置。

时间:2012-03-30 15:23:26

标签: c# .net winforms web-services

我使用单例模式创建了一个我在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;
            }
        }
    }

}

2 个答案:

答案 0 :(得分:4)

如果您有一个应用程序的单个实例,该对象将在应用程序关闭或崩溃时被销毁。您可以在终结器中调用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应用程序。

但请记住,您必须仔细考虑您的设计。如果您有记录器并且文件无法访问该怎么办?如果代理失去连接怎么办?等等。

答案 1 :(得分:3)

不确定C#是如何做到的,但在Java中,你需要创建一个私有构造函数来阻止人们做new ListService()