Можно ли обернуть один сингл С# в интерфейсе?
В настоящее время у меня есть класс, в котором у меня есть только статические члены и константы, однако я бы хотел заменить его на 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 может реализовать интерфейс, если вы хотите, просто помните, что другие классы также могут реализовать тот же интерфейс