Singleton中的IDisposposable--良好实践?

时间:2010-02-19 04:24:12

标签: c# singleton

我有一个Singleton类来管理与外部设备的连接。我的应用程序的想法是,我需要在应用程序处于活动状态时始终显示外部设备。

Singleton具有以下功能:

  1. 初始化,在应用程序启动时查找设备
  2. 与外部设备通信,请注意,这可以在多个点上分布在多个程序集上。
  3. 应用程序退出时关闭连接。
  4. 对于最后一部分,我正在考虑将代码放在singleton类的Dispose方法中,以保证资源在关闭时始终是清理的。但由于我使用的是Singleton,并且由于单例生命周期只会在应用程序退出时终止,因此无需在Dispose中明确关闭连接,因为无论如何连接都将关闭。

    所以,问题是,我应该将紧密连接代码放在Dispose方法中吗?

5 个答案:

答案 0 :(得分:3)

单独实施IDisposable并不意味着退出时会调用Dispose

没有足够的细节来理解你的应用程序,但是如果关闭不正确使得设备处于不良状态而不是try / finally或者Moron建议Application.Exit(取决于当然的应用程序)。

即便如此,你也无法保证代码能够执行,所以也许我不清楚你想要完成什么或者你想要解决什么问题。

修改

根据OP评论最好的选择(因为他希望“清理”代码执行而不是专门调用和untestable)将把它放在解构器/终结器中。请注意,这不能保证运行,但应该在大多数情况下运行而不被调用(与Dispose不同):

public class Foo
{
    public Foo()
    {
        //Constructor
    }

    ~Foo()
    {
        // Deconstructor/finalizer
    }
}

答案 1 :(得分:2)

IDisposable!=像C ++这样的析构函数,它必须被明确地调用。

无论如何,拥有一次性单身人士并没有多大意义,IMO。如果某些代码实际上解决了你的单身人士怎么办?如果其他一些代码现在尝试访问该单例,会发生什么?出于这个原因,你可能不应该把连接放在那里。

事实上,你应该甚至在第一个地方中使用Singleton实现IDisposable。

更好的选择可能是将Singleton挂钩到其中一个.NET退出事件上。也许使用Application.ApplicationExit(或Application.Exit)事件或类似事件。

答案 2 :(得分:1)

这是糟糕的设计。您可以在适当的时候使用打开和关闭方法更好地服务。它将更容易测试,调试和支持。

答案 3 :(得分:0)

同时执行两个操作,如同使用显式的Close()或Shutdown()方法,并在dispose中调用它(如果调用了track,请参阅dispose pattern help ...)

这样你就可以实现IDisposable接口(这意味着明显的意图)并在你的代码中调用它。

您是否在启动代码周围使用“finally”块?

internal static class App
{
    [STAThread]
    private static void Main(string[] args)
    {
        try
        {
            Thing.Startup();
            Application.Run();
        }
        finally
        {
            Thing.Shutdown(); // or dispose
        }
    }
}

让我的漂移?!

PK: - )

PS:“单身”应该写成普通类,单身部分应该是外部使用的东西

答案 4 :(得分:0)

正如其他人所说,Dispose不会在退出时自动调用,但会调用终结器方法。我会这样做,而是在应用程序退出时执行清理逻辑。