Можно ли обернуть C # синглтон в интерфейсе? - PullRequest
11 голосов
/ 20 декабря 2010

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

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

Ответы [ 4 ]

10 голосов
/ 20 декабря 2010

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

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

8 голосов
/ 20 декабря 2010

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

Базовый класс синглтона:

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++;
}
6 голосов
/ 20 декабря 2010

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

0 голосов
/ 20 декабря 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...