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

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

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

Ответ 1

Решение для рассмотрения (а не для ручной раскрутки) будет заключаться в использовании контейнера IoC, например. Unity.

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

  //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>();

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

Ответ 2

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

Один базовый класс:

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

Ответ 3

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

Ответ 4

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

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

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