Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 状态很重要的对象的最佳设计模式-单例或静态_C#_Design Patterns_Static_Dependency Injection_Singleton - Fatal编程技术网

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

C# 状态很重要的对象的最佳设计模式-单例或静态,c#,design-patterns,static,dependency-injection,singleton,C#,Design Patterns,Static,Dependency Injection,Singleton,更具体地说,在实现依赖项注入的应用程序中,对于状态重要的类,最好的方法是什么 假设我需要访问处于特定状态的对象。例如,这个对象可能是在不同的线程中启动的,或者是由我无法控制的进程启动的 HttpContext就是.NET中已经存在的类似对象的一个很好的例子 在这种情况下,微软决定采用静态方法,所以我只说: var currentObj = HttpContext.Current; 这给了我一个对象的特殊实例,而不必担心它来自哪里 静态方法的问题在于它不能很好地处理依赖项注入 另一个选项是将特定

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

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

HttpContext就是.NET中已经存在的类似对象的一个很好的例子

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

var currentObj = HttpContext.Current;
这给了我一个对象的特殊实例,而不必担心它来自哪里


静态方法的问题在于它不能很好地处理依赖项注入

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

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

那么,有没有一种模式可以帮助我

背景: 对于上下文,我正在处理一个应用程序,该应用程序有许多执行IO操作的类实例。它们存在于自己的线程中

我希望能够通过web界面与这些对象(后台任务)交互,因此需要一个控制器。我希望能够审问他们,操纵他们等等

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

  • “状态”可能是个错误的词。我的意思是与我无法控制其生命周期的对象通信
  • 有趣的是,我在谈论静态类时使用了“stateful”。这就是我给出HttpContext示例的原因,因为它就是这样做的。当前属性为您获取一个非常特定的实例,而不是任何新实例
  • 当我说静态不能很好地处理DI时,我的意思是,不能注入静态类。我可以创建一个包装器,是的,但我只是把问题推到别处不
  • 我应该更清楚我对单身的定义。我指的是一种单身生活方式,正如国际奥委会容器中定义的那样

  • 我总是喜欢单件而不是静态的。事实上,我几乎从不在自己的类中使用静态。真正的单例和静态类都很难编写自动化测试。您的意思是在运行时查找单个实例吗?这对我来说是有意义的,但我不知道在C#中使用的正确构造。Java中的模拟是JNDI。

    两者都不是或两者都是。假设有状态依赖是线程安全的,更好的方法是围绕所述依赖构建至少一个基本的抽象层,然后将所述抽象注入到类中。那么,单例与静态的对比就变得无关紧要了。

    “静态方法的问题是,它不能很好地处理依赖注入。”-您尝试过什么?似乎你也可以考虑池而不是单例。你所说的“对象的状态重要性在代码中不再明确”是什么意思?你的问题似乎太抽象而无法回答。难道不是所有非平凡的对象都是有状态的吗?具有讽刺意味的是(无论如何,对我来说)你将stateful一词应用于静态方法。单例的
    get
    访问器本身就是一个静态属性(或者方法,如果你喜欢的话),不是吗?因此,这不仅仅是一个静态与单例的问题,更多的是关于您的方法…@Mark:大概他可以简单地在他的DI框架中将项目标记为单例,从而将相同的实例返回给所有人。所以,不,不一定会涉及静态属性。@johnopeinvo:“大概他可以简单地在他的DI框架中将该项标记为一个单例,从而将相同的实例返回给所有人”——这完全正确,John,thankscool,ThankJohn。我想我问这个问题是想看看我是否错过了更大的第三选择。我想关键是要使用IoC容器控制器Singleton。干杯那你就不能把同样的问题转移到另一个班上吗?不太可能。您的类具有构造函数依赖关系,并不真正关心依赖关系是从何而来的。可以根据需要轻松使用实例类,或者使用IoC包装一个单例或静态引用。