更具体地说,在实现依赖注入的应用程序中,对于状态很重要的类,最好的方法是什么。
比如说,我需要访问处于特定状态的对象。例如,这个对象可能已经在不同的线程中初始化,或者是由我无法控制的进程初始化。
一个已经存在于.NET中的这样的对象的很好例子就是HttpContext。
在这种情况下,Microsoft决定采用静态方法,所以我只需要说:
这使我能够获得一个特定的对象实例,而不必担心它来自哪里。
静态方法的问题在于它与依赖注入的结合不是很好。
另一种选择是在您的IoC容器中将某个类配置为单例。这意味着您可以注入它,并且根据当前的IoC容器配置,它将是该类的正确实例。
但是,这种方法的缺点是对象的有状态重要性不再在代码中明确,通过查看代码并不明显。使用Static类访问和实例化更清晰地表明了状态的重要性。也许这并不重要。
那么,有没有一种模式可以帮助我?
背景:我正在开发一个具有许多执行IO操作的类实例的应用程序。它们存在于自己的线程中。
我想通过Web界面(控制器)与这些对象(后台任务)进行交互。我想能够询问它们并操作它们等。
更新:抱歉,我觉得我使用“有状态”的术语有点误导人。让我解释一下:
1. “状态”可能是错误的词。我的意思是与对象通信,我对其生命周期没有控制权。
2. 当我谈论静态类时,使用“有状态”是有趣的。这就是为什么我举了HttpContext的例子,因为它确实是这样做的。Current属性为您提供一个非常特定的实例,而不是任何新实例。
3. 当我说静态方法与DI不兼容时,我的意思是,您无法注入静态类。是的,我可以创建一个包装器,但我只是将问题推到其他地方,不是吗?
4. 我应该更清楚地定义Singleton。我指的是IoC容器中定义的单例生命周期。
比如说,我需要访问处于特定状态的对象。例如,这个对象可能已经在不同的线程中初始化,或者是由我无法控制的进程初始化。
一个已经存在于.NET中的这样的对象的很好例子就是HttpContext。
在这种情况下,Microsoft决定采用静态方法,所以我只需要说:
var currentObj = HttpContext.Current;
这使我能够获得一个特定的对象实例,而不必担心它来自哪里。
静态方法的问题在于它与依赖注入的结合不是很好。
另一种选择是在您的IoC容器中将某个类配置为单例。这意味着您可以注入它,并且根据当前的IoC容器配置,它将是该类的正确实例。
但是,这种方法的缺点是对象的有状态重要性不再在代码中明确,通过查看代码并不明显。使用Static类访问和实例化更清晰地表明了状态的重要性。也许这并不重要。
那么,有没有一种模式可以帮助我?
背景:我正在开发一个具有许多执行IO操作的类实例的应用程序。它们存在于自己的线程中。
我想通过Web界面(控制器)与这些对象(后台任务)进行交互。我想能够询问它们并操作它们等。
更新:抱歉,我觉得我使用“有状态”的术语有点误导人。让我解释一下:
1. “状态”可能是错误的词。我的意思是与对象通信,我对其生命周期没有控制权。
2. 当我谈论静态类时,使用“有状态”是有趣的。这就是为什么我举了HttpContext的例子,因为它确实是这样做的。Current属性为您提供一个非常特定的实例,而不是任何新实例。
3. 当我说静态方法与DI不兼容时,我的意思是,您无法注入静态类。是的,我可以创建一个包装器,但我只是将问题推到其他地方,不是吗?
4. 我应该更清楚地定义Singleton。我指的是IoC容器中定义的单例生命周期。
get
访问器本身就是一个静态属性(或者如果你喜欢的话,是一个方法),不是吗?因此这不仅仅是关于静态 vs. Singleton 的问题,更多的是关于你的方法... - Mark Ursino