【问题标题】:Singleton pattern used to create web service but what about dispose.单例模式用于创建 Web 服务,但如何处置。
【发布时间】:2012-03-30 15:23:26
【问题描述】:

我使用单例模式创建了一个 Web 服务的单个实例,我在我的 win 表单应用程序中使用了该实例。我已经看到这是 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;
            }
        }
    }

}

【问题讨论】:

  • 在哪里你见过它声称在 WinForms 应用程序中使用单例是个好主意?
  • 处理代理比您提供的代码要复杂一些...如果您要将代理对象保留在内存中,则必须添加代码以重新创建它如果通道有故障,确保它没有被关闭,等等。
  • 在下面的帖子中提到这是一个好主意。但是,它似乎是在 web 而不是 winforms 的上下文中。 stackoverflow.com/questions/429478/…
  • @JonSkeet:他不就是在问这个吗?他说“我想知道这是否也适用于 winform 应用程序”。他不知道网络应用的主张是否也适用于 WinForms。
  • @Abel: 嗯...要么我之前看错了,要么他当时编辑了它。考虑将我的问题编辑为“您在哪里看到它声称在 Web 应用程序中使用单例是一种很好的做法?” (尽管 OP 现在已经回答了这个问题。)

标签: c# .net winforms web-services


【解决方案1】:

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

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

【讨论】:

  • 谢谢亚伯。感谢您的 cmets 和对我的问题的反馈。我现在对自己的方向更有信心了。
【解决方案2】:

不知道C#是怎么做的,但是在Java中,你需要创建一个私有构造函数来防止人们做new ListService()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多