Как сделать универсальный синглтон базовый класс C#
Я пытаюсь создать общий базовый класс синглтона, как
public class SingletonBase<T> where T : class, new()
{
private static object lockingObject = new object();
private static T singleTonObject;
protected SingletonBase()
{
}
public static T Instance
{
get
{
return InstanceCreation();
}
}
public static T InstanceCreation()
{
if(singleTonObject == null)
{
lock (lockingObject)
{
if(singleTonObject == null)
{
singleTonObject = new T();
}
}
}
return singleTonObject;
}
}
Но я должен сделать конструктор публичным в производном.
public class Test : SingletonBase<Test>
{
public void A()
{
}
private Test()
: base()
{ }
}
Ошибка компиляции:
'Test' должен быть неабстрактным типом с открытым конструктором без параметров, чтобы использовать его в качестве параметра 'T' в универсальном типе или методе 'Test'
Как мне этого добиться?
2 ответа
Проблема в вашем общем ограничении where T : class, new()
, new()
для ограничения требуется открытый конструктор без параметров в T. Обойти это невозможно; вам нужно предоставить такой конструктор в Permission Controller
,
Я бы избежал такого рода рекурсивных шаблонов. Прочитайте этот пост в блоге для подробного объяснения модели и причин не использовать его.
Насколько я могу судить, вам не нужно иметь подклассы SingletonBase<T>
, Я не вижу ничего, что подкласс SingletonBase<T>
сможет добавить к вашему коду. Я бы просто переписал это как
public static class Singleton<T> where T : class, new()
{
...
}
Затем вы можете использовать его как
var test = Singleton<Test>.Instance;
Если вы хотите иметь возможность использовать Test
как одиночка, создайте его как
public class Test
{
public static T Instance
{
get { return Singleton.Instance<Test>; }
}
}