状态很重要的对象的最佳设计模式 - 单例或静态

时间:2011-03-08 03:03:40

标签: c# design-patterns static dependency-injection singleton

更具体地说,在实现依赖注入的应用程序中,状态很重要的类的最佳方法是什么。

假设我需要访问处于特定状态的对象。例如,此对象可能是在不同的线程中启动的,或者是由我无法控制的进程启动的。

在.NET中已经存在的像这样的对象的一个​​很好的例子是HttpContext。

在这种情况下,微软决定采用静态方法,所以我只想说:

var currentObj = HttpContext.Current;

这给了我一个对象的特定实例,而不必担心它来自何处。

静态方法的问题在于它在依赖注入方面不能很好地发挥作用。

另一种选择是将您的某个类配置为IoC容器中的Singleton。这意味着您可以注入它,并且根据当前的IoC Container配置,它将是该类的正确实例。

然而,这种方法的缺点是对象的有状态重要性在代码中不再明确,通过查看它并不明显。使用Static类来访问和实例,更清楚的是状态是重要的。也许这无关紧要。

那么,有没有一种模式可以帮助我在这里?

上下文:

对于上下文,我正在开发一个应用程序,它有许多实例执行IO操作的实例。它们存在于自己的线程中。

我希望能够通过Web界面与这些对象(后台任务)进行交互,从而实现Controller。我希望能够审问他们,并操纵他们等等。

更新

对不起,我认为我对“有状态”一词的使用有点误导。让我解释一下:

  1. “州”可能是错误的词。我的意思是与一个对象进行通信,从而无法控制它的生命周期。
  2. 在谈论静态类时,我使用“有状态”很有趣。这就是为什么我给出了HttpContext示例,就像它所做的一样。 Current属性为您提供了一个非常具体的实例,而不是任何新实例。
  3. 当我说静态不适合DI时,我的意思是,你不能注入静态类。我可以创建一个包装器,是的,但我只是把问题推到别处没有?
  4. 我应该更清楚我对Singleton的定义。我的意思是Singleton生活方式,如IoC Container中所定义。

3 个答案:

答案 0 :(得分:3)

我总是喜欢Singleton而不是静态。事实上,我几乎从不在自己的班级中使用静力学。

答案 1 :(得分:1)

真正的单例和静态类都很难编写自动化测试。你的意思是单个实例在运行时查找?这对我有意义,但我不知道在C#中使用正确的构造。 Java中的模拟是JNDI。

答案 2 :(得分:1)

两者兼而有之。假设有状态依赖是线程安全的,更好的方法是围绕所述依赖构建至少一个基本的抽象层,然后将所述抽象注入到您的类中。 Singleton vs static变得非常无形。