更具体地说,在实现依赖注入的应用程序中,状态很重要的类的最佳方法是什么。
假设我需要访问处于特定状态的对象。例如,此对象可能是在不同的线程中启动的,或者是由我无法控制的进程启动的。
在.NET中已经存在的像这样的对象的一个很好的例子是HttpContext。
在这种情况下,微软决定采用静态方法,所以我只想说:
var currentObj = HttpContext.Current;
这给了我一个对象的特定实例,而不必担心它来自何处。
静态方法的问题在于它在依赖注入方面不能很好地发挥作用。
另一种选择是将您的某个类配置为IoC容器中的Singleton。这意味着您可以注入它,并且根据当前的IoC Container配置,它将是该类的正确实例。
然而,这种方法的缺点是对象的有状态重要性在代码中不再明确,通过查看它并不明显。使用Static类来访问和实例,更清楚的是状态是重要的。也许这无关紧要。
那么,有没有一种模式可以帮助我在这里?
对于上下文,我正在开发一个应用程序,它有许多实例执行IO操作的实例。它们存在于自己的线程中。
我希望能够通过Web界面与这些对象(后台任务)进行交互,从而实现Controller。我希望能够审问他们,并操纵他们等等。
对不起,我认为我对“有状态”一词的使用有点误导。让我解释一下:
答案 0 :(得分:3)
我总是喜欢Singleton而不是静态。事实上,我几乎从不在自己的班级中使用静力学。
答案 1 :(得分:1)
真正的单例和静态类都很难编写自动化测试。你的意思是单个实例在运行时查找?这对我有意义,但我不知道在C#中使用正确的构造。 Java中的模拟是JNDI。
答案 2 :(得分:1)
两者兼而有之。假设有状态依赖是线程安全的,更好的方法是围绕所述依赖构建至少一个基本的抽象层,然后将所述抽象注入到您的类中。 Singleton vs static变得非常无形。