是否可以在接口中包装C#单例?

时间:2010-12-20 16:33:41

标签: c# interface singleton

我目前有一个类,我只有静态成员和常量,但是我想用一个包装在界面中的单例替换它。

但是我怎么能这样做,记住我见过的每个单例实现都有一个静态的Instance方法,从而破坏了接口规则?

4 个答案:

答案 0 :(得分:10)

要考虑(而不是自己动手)的解决方案是利用IoC容器,例如: Unity

IoC容器通常支持针对接口注册实例。这提供了您的单例行为,因为客户端解析接口将接收单个实例。

  //Register instance at some starting point in your application
  container.RegisterInstance<IActiveSessionService>(new ActiveSessionService());

  //This single instance can then be resolved by clients directly, but usually it
  //will be automatically resolved as a dependency when you resolve other types. 
  IActiveSessionService session = container.Resolve<IActiveSessionService>();

您还可以获得额外的优势,即您可以轻松地改变单例的实现,因为它是针对接口注册的。这对于生产非常有用,但对于测试来说可能更有用。真正的单身人士在测试环境中会非常痛苦。

答案 1 :(得分:8)

您无法使用接口执行此操作,因为它们仅指定实例方法,但您可以将其放在基类中。

单身基类:

public abstract class Singleton<ClassType> where ClassType : new()
{
  static Singleton()
  {
  }

  private static readonly ClassType instance = new ClassType();

  public static ClassType Instance
  {
    get
    {
      return instance;
    }
  }
}

儿童单身人士:

class Example : Singleton<Example>
{
  public int ExampleProperty { get; set; }
}

来电者:

public void LameExampleMethod()
{
  Example.Instance.ExampleProperty++;
}

答案 2 :(得分:6)

您可以让单个人的所有其他成员在接口中实现相应的成员。但是,你是正确的Instance属性不能成为接口的一部分,因为它是(并且必须保持)静态。

答案 3 :(得分:0)

接口不能在C#中有实例,我想你只需要:

实现单例模式(是的,你需要一个静态属性或方法来获取实例,但其他一切都不需要是静态的)

另一方面,你的单身人士可以实现一个接口,只要记住其他类也可以实现相同的接口