Можно ли обернуть синглтон C# в интерфейс?

в настоящее время у меня есть класс, в котором у меня есть только статические члены и константы, однако я хотел бы заменить его синглтоном, завернутым в интерфейс.

но как я могу это сделать, имея в виду, что каждая одноэлементная реализация, которую я видел, имеет статический метод экземпляра, тем самым нарушая правила интерфейса?

4 ответов


решением для рассмотрения (а не ручной прокатки) было бы использовать контейнер 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>();

вы также получите дополнительное преимущество, что вы можете легко изменять реализацию синглтона по мере его регистрации против интерфейса. Это может быть полезно для производства, но, возможно, тем более для тестирования. Истинные синглеты могут быть довольно болезненными в тестовых средах.


вы не можете сделать это с интерфейсами, так как они указывают только методы экземпляра, но вы можете поместить это в базовый класс.

одноэлементный базовый класс:

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++;
}

вы можете сделать все другие члены вашего синглтона реализуют соответствующие члены в интерфейсе. Однако вы правы, что Instance свойства не может быть частью интерфейса, так как он (и должен оставаться) статическим.


интерфейсы не могут иметь экземпляров в C#, я думаю, вам нужно только:

реализуйте шаблон singleton (да, вам понадобится статический атрибут или метод для получения экземпляра, но все остальное не требует статики)

с другой стороны, ваш синглтон может реализовать интерфейс, если вы хотите, просто помните, что другие классы также могут реализовать тот же интерфейс