2010-02-19 44 views
3

我有一个Singleton类,用于管理与外部设备的连接。我的应用程序的想法是,我需要在应用程序处于活动状态时始终显示外部设备。Singleton中的一次性IDisposable - 良好实践?

单例具有以下功能:

  1. 初始化,查找设备在应用程序启动时
  2. 与外部设备进行通信,注意,这可以在多个点的多个组件扩散。
  3. 应用程序退出时关闭连接。

对于最后一部分,我想这会让里面的代码的单例类的Dispose方法,以保证资源总是在闭合时清理。但是由于我使用的是Singleton,并且由于单身人员的生存期只会在应用程序退出时终止,因此无需明确关闭连接,因为连接无论如何都将关闭。

所以,问题是,我应该把密切相关的代码里面Dispose方法?

回答

3

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

没有足够的信息来了解你的应用程序,但如果不正确地关闭离开装置在一个糟糕的状态,也许比一个try /终于或者白痴建议Application.Exit(取决于课程的应用程序)。

即使那么你就不能保证代码执行,所以也许我并不清楚你想什么来完成,或者你正在试图解决什么问题。

编辑:

每老年退休金计划发表评论的最佳选择(为他的愿望,有“清理”代码,而没有特别的调用,不可测执行)将其放在解构/终结。请注意,这不能保证运行,但在大多数情况下不被称为(不像处置)应运行:

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

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

@cory,我试图确保当应用程序退出连接时将被关闭,无论如何。 – Graviton 2010-02-19 04:39:25

+0

@Ngu Soon Hui:这是我不理解的部分。当应用程序退出(无论如何)通信关闭时。那么你是否试图防止设备处于不良状态?或者是其他东西? – 2010-02-19 04:41:05

+0

我试图防止应用程序退出时通信关闭。 – Graviton 2010-02-19 04:57:46

2

IDisposable的!=析构象C++,它必须显式调用。

反正有一次性辛格尔顿并没有太大的意义,海事组织。如果某些代码实际上做了Dispose Singleton?如果其他代码现在尝试访问该单例,会发生什么情况?出于这个原因,你可能不应该把连接放在那里。

事实上,你应该甚至有辛格尔顿在首位实现IDisposable。

一个更好的选择可能是有辛格尔顿钩到.NET退出事件之一。也许使用Application.ApplicationExit(或Application.Exit)事件或类似的东西。

+0

使用'Application.Exit'可以让我在我的所有应用程序中实现相同的代码行,这让我非常讨厌。如果可能的话,我不想关闭关闭连接部分 – Graviton 2010-02-19 04:41:09

+0

.NEt将退出时引发一些事件。让你的单例类挂钩到那里,并关闭那里的连接。检查MSDN。 http://msdn.microsoft.com/en-us/library/system.windows.application.exit.aspx可能是一个很好的起点。 – 2010-02-19 04:42:32

+0

@Ngu:如果你想干净地关闭连接,你必须编写该代码。主要问题是_where_。 – 2010-02-19 04:49:47

0

都做,在有明确的关闭()或shutdown()方法,并调用在配置(跟踪如果被调用等,见配置模式帮助...)

通过这种方式,您可以实现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:一个“单身”应写为正常类,单身部分应该是外用的事情

+0

+1将生命周期管理与其他功能分开!您可以使用带有IoC容器框架的Plain Old CLR对象来处理生命周期管理。 – TrueWill 2010-02-19 04:52:40

+0

我反对使用容器进行管理(例如castle windsor)。 :-) – 2010-02-19 05:05:57

+0

最后一部分'Thing.Shutdown();'是我想要避免写在'main'主体中的东西 – Graviton 2010-02-19 05:20:36

0

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

+0

在正常情况下,是的。异常,没有。这是我没有得到的。他试图防止他的问题出现什么问题,并且可以在下次加载/使用时解决问题? – 2010-02-19 04:55:12

+1

即使在正常情况下,终结器也不保证被调用。我错过了一些新的.NET开发吗? – 2010-02-19 04:57:06

+0

没有保证,这是我的主要观点。我想他只是要求一些他不必专门打电话/执行的东西。解构器/终结器是如何提供的。 – 2010-02-19 05:08:46

1

这是不好的设计。在适当的时候打电话和打电话的方法会更好。测试,调试和支持将更加容易。

+0

但是不得不手动调用打开和关闭很麻烦。 – Graviton 2010-02-19 05:26:29

+2

是的......我*总是*发现可验证的,可测试的代码繁琐。但我不担心那个因为我整夜都在睡觉*。 – 2010-02-19 15:56:01