是否可以在接口中封装一个C#singleton?

是否可以在接口中封装一个C#singleton?,c#,interface,singleton,C#,Interface,Singleton,我目前有一个类,其中只有静态成员和常量,但是我想用一个封装在接口中的单例来替换它 但是我如何做到这一点呢?请记住,我见过的每个单例实现都有一个静态实例方法,因此违反了接口规则。您可以让单例的所有其他成员在一个接口中实现相应的成员。但是,正确的是,实例< /代码>属性不能是接口的一部分,因为它是(并且必须保持)静态的。 一个要考虑的解决方案(而不是手动翻滚)是利用ioc容器,例如。 IoC容器通常支持针对接口注册实例。这提供了您的单例行为,因为针对接口进行解析的客户端将接收单个实例 //Reg

我目前有一个类,其中只有静态成员和常量,但是我想用一个封装在接口中的单例来替换它

但是我如何做到这一点呢?请记住,我见过的每个单例实现都有一个静态实例方法,因此违反了接口规则。

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

一个要考虑的解决方案(而不是手动翻滚)是利用ioc容器,例如

。 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>();
//在应用程序的某个起点注册实例
RegisterInstance(新的ActiveSessionService());
//然后,客户机可以直接解析这个实例,但通常
//将在解析其他类型时自动解析为依赖项。
IActiveSessionService会话=container.Resolve();

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

你不能用接口来做这件事,因为它们只指定实例方法,但你可以把它放在基类中

单例基类:

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

  private static readonly ClassType instance = new ClassType();

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

接口不能有C#中的实例,我认为您只需要:

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


另一方面,如果您愿意,您的单例可以实现一个接口,请记住,其他类也可以实现相同的接口

听起来很有趣-在您的代码示例中,什么是“容器”?@Surfbutler“container”是IoC容器实例。在本例中,它是一个IUnityContainer。谢谢chibacity,那么“ActiveSessionService”呢?这是一个示例单例类名,还是Unity的一部分?对不起,今天晚上我脑子进水了!这只是一个示例类,替换为您自己的。这个抽象类适合我。我绝对做了一些改动:
public抽象类Singleton其中T:new(){private static T\u instance;private Singleton(){}public static T instance{get{if(等于(\u instance,默认值(T)){u instance=new T();}return _instance;}}}
ClassType instance=new ClassType()
可以替换为
Lazy instance=new Lazy(()=>new ClassType())
用于延迟执行,这在
ClassType
的初始化成本较高时非常有用。
class Example : Singleton<Example>
{
  public int ExampleProperty { get; set; }
}
public void LameExampleMethod()
{
  Example.Instance.ExampleProperty++;
}