Singleton Data Access Layers
-
05-07-2019 - |
Вопрос
На нашем рабочем уровне доступа к данным у нас есть стандартная реализация, в которой доступ к классу осуществляется через одноэлементное открытое свойство, которое выглядит примерно так:
public static CustomerController Instance
{
get
{
lock(singletonLock)
{
if( _instance == null )
{
_instance = new CustomerController();
}
return _instance;
}
}
}
Теперь я понимаю, что делает код, но мне было интересно, почему вы делаете это, просто создавая экземпляр класса каждый раз, когда он используется?
Решение
РЕДАКТИРОВАТЬ: О, боже, я не уловил " Слои доступа к данным " часть. Но у меня также есть пример этого: если ваше многопоточное приложение направляет все свои вызовы базы данных через одноэлементный класс, только один поток когда-либо будет обращаться к базе данных одновременно, избегая условий гонки.
Если у вас есть механизм ведения журнала в многопоточном приложении, которое вы используете, чтобы выплевывать все исключения и просто записывать информацию (особенно для служб или приложений, которые всегда работают, распечатывать статусы всякий раз, когда что-то происходит), вы будете столкнуться с проблемами блокировки файлов. Я использую класс одноэлементного регистратора, так что только один поток когда-либо будет иметь доступ к регистратору, а остальные будут ждать, пока регистратор сможет написать свою строку в текстовом файле.
Есть много классных причин использовать синглтон, но я был похож на вас и не знал, для чего они предназначены, пока не столкнулся с этой проблемой с доступом к файлам в многопоточном приложении.
Другие советы
Возможно, вы захотите сделать это также, с двойной проверкой блокировки, это ускорит доступ к вашему синглтону
public static CustomerController Instance
{
get
{
if( _instance == null )
{
lock(singletonLock)
{
if( _instance == null )
{
_instance = new CustomerController();
}
}
}
return _instance;
}
}
Ответ довольно прост: вы хотите получать один и тот же объект каждый раз, когда он используется. Р>
Это дает вам преимущества быть глобальной переменной (т. е. есть только одна) с преимуществами того, чтобы быть объектом класса (помимо прочего, он может выполнять невидимую инициализацию в первый раз, когда это необходимо).