Итак, я работаю на уровне промежуточного программного обеспечения.
Я использую COM DLL, которая взаимодействует с аппаратным взаимодействием низкого уровня, и предоставляю интерфейс для пользовательского интерфейса для выполнения ввода-вывода с аппаратным обеспечением.
В рамках разработки моего уровня мы включили контекстный менеджер, который упорядочивает различные аппаратные средства для создания контекстов, с которыми может работать наше приложение.
Поэтому я хочу гарантировать, что разработчиккоторый работает с моим кодом, имеет один менеджер контекста для работы, и затем внутри этого менеджера контекста я могу гарантировать, что мы выделяем только 1 рабочую очередь на аппаратное устройство.
Просто, чтобы усложнить это, требуется некоторая инициализация,сделать, прежде чем я могу начать добавлять в аппаратные устройства.Что-то, что было бы просто, если бы не тот факт, что обычно вы получаете доступ к одиночному файлу только через свойство readonly.
Я знаю, что одноэлементный шаблон может усложнить многие вещи из-за его глобальной доступности.Я действительно не хочу и не хочу, чтобы этот класс имел глобальную доступность синглтона, я просто хочу гарантировать, что в приложении будет создан только один.
Для этого я бы с ума сошел что-то сделатьвот так, чтобы в принципе дать моему синглтону конструктор:
public class MySingleton
{
private static MySingleton _MySingleton;
private static object singletonLock = new object();
private MySingleton(int foo1, string foo2)
{
//do init stuff
}
public static MySingleton StartSingleton(int foo1, string foo2)
{
try
{
Monitor.Enter(singletonLock);
if (_MySingleton == null)
{
_MySingleton = new MySingleton(foo1, foo2);
}
else
throw new Exception("Singleton already initialized");
}
finally
{
Monitor.Exit(singletonLock);
}
return _MySingleton;
}
public static MySingleton Instance
{
get
{
try
{
Monitor.Enter(singletonLock);
if (_MySingleton == null)
{
throw new Exception("Singleton must be Initialized");
}
}
finally
{
Monitor.Exit(singletonLock);
}
return _MySingleton;
}
}
}