C# 使用全局变量比使用单例更好

C# 使用全局变量比使用单例更好,c#,oop,design-patterns,singleton,C#,Oop,Design Patterns,Singleton,我有一个队列,应该由一些类使用 所有类都是相同的队列,所以我想也许我会把队列作为静态成员放在静态类中。 但我知道这不是很好的OOP(尽管我认为singleton是设计模式之一) 所以我想要一个实现这个队列的想法, 我需要它是唯一的,并且对所有类都是可访问的,因为所有类都使用相同的队列。我不会将它设为单例,因为这对程序中的所有类和层都是全局可见的。为需要访问队列的部分提供对队列本身的引用。因此,您可以清楚地确定软件的哪个部分可以访问它 我在软件项目中有过非常糟糕的经历,其中有太多的单例,也就是“X

我有一个队列,应该由一些类使用

所有类都是相同的队列,所以我想也许我会把队列作为静态成员放在静态类中。 但我知道这不是很好的OOP(尽管我认为singleton是设计模式之一) 所以我想要一个实现这个队列的想法,
我需要它是唯一的,并且对所有类都是可访问的,因为所有类都使用相同的队列。

我不会将它设为单例,因为这对程序中的所有类和层都是全局可见的。为需要访问队列的部分提供对队列本身的引用。因此,您可以清楚地确定软件的哪个部分可以访问它


我在软件项目中有过非常糟糕的经历,其中有太多的单例,也就是“XyzManager”,因为它们是从软件的任何部分以一种疯狂的方式使用的。尽可能避免使用全局变量和单例。最好在对象中引用它们应该访问的内容。

我不会将其设置为单例,因为这将对程序中的所有类和层都是全局可见的。为需要访问队列的部分提供对队列本身的引用。因此,您可以清楚地确定软件的哪个部分可以访问它


我在软件项目中有过非常糟糕的经历,其中有太多的单例,也就是“XyzManager”,因为它们是从软件的任何部分以一种疯狂的方式使用的。尽可能避免使用全局变量和单例。最好在对象中引用它们应该访问的对象。

您所说的是,您的类共享一些上下文,而该上下文包含一个队列。我们可以说,您的类依赖于此上下文

单例模式不是一个好主意的原因是它使用全局(静态)上下文作为公共上下文。这一限制有两个原因:

  • 要清楚地识别类的依赖关系并不容易,因此在不同的环境(例如单元测试环境)下设置它们也不容易

  • 完全不可能同时运行此上下文的两个实例

  • 因此,一个简单的解决方案是将类的所有依赖项放在一个上下文类中,然后将所有类与该类的实例链接


    另一个更高级的解决方案是使用依赖项注入框架。

    您所说的是,您的类共享一些上下文,而该上下文包含一个队列。我们可以说,您的类依赖于此上下文

    单例模式不是一个好主意的原因是它使用全局(静态)上下文作为公共上下文。这一限制有两个原因:

  • 要清楚地识别类的依赖关系并不容易,因此在不同的环境(例如单元测试环境)下设置它们也不容易

  • 完全不可能同时运行此上下文的两个实例

  • 因此,一个简单的解决方案是将类的所有依赖项放在一个上下文类中,然后将所有类与该类的实例链接


    另一个更高级的解决方案是使用依赖项注入框架。

    是否使用IoC容器?创建包含队列(或ConcurrentQueue)的单音类,并公开类中所有需要的功能。是否使用IoC容器?创建包含队列(或ConcurrentQueue)的单音类我认为DI框架没有你提出的解决方案复杂。当然这是一个需要掌握的新概念,但它产生了更干净的代码。我认为DI框架没有您提出的解决方案复杂。当然这是一个需要掌握的新概念,但它产生了更清晰的代码。