如何在不提供C#中的全局/静态变量的情况下实现单例模式?

时间:2012-11-01 14:15:41

标签: c# .net design-patterns

  

可能重复:
  How to implement singleton without using static/global variable? Possible?

大多数人说单身人士是邪恶的原因之一是它提供了一个全球访问点,或者它变成了一个全局变量。是否可以实现单例而不包含任何类型的全局变量,包括静态变量。是否可以在C#.NET中执行此操作?

4 个答案:

答案 0 :(得分:3)

你所暗示的问题是,Singleton变成就像一个全局var。它的用途无关紧要。

答案是否定的。你总是需要一个静态的东西,你只能推迟它。而那种失败的观点。

答案 1 :(得分:2)

不,那不会是单身人士。

您可以使用IoC容器仅将内容作为单例注入。

答案 2 :(得分:2)

您可以实现一个接口,然后使用像StructureMap这样的东西。在SM中你可以像这样构建类:

public class Foo : IFoo
{
}

然后您将在容器中定义以下内容:

ObjectFactory.Initialize(x =>
{
    x.For<IFoo>.Singleton().Use<Foo>();
}

然后你会在你需要的地方注入这个资源:

public class Bar
{
    public Bar(IFoo foo)
    {
    }
}

所以,现在只会创建一个具体的实例,然后注入需要它的可以数量的类型。

答案 3 :(得分:0)

我不相信。如果没有静态变量,那么您在哪里存储实例?通常,当我想要一个类的单例时,我将所有构造函数设为私有,并提供一个静态方法或属性,如果尚未创建该实例,则提供该实例,并返回该实例。实例本身存储为私有变量,因此访问它的唯一方法是通过提供的方法/属性 - 或反射。