Вопрос

На нашем рабочем уровне доступа к данным у нас есть стандартная реализация, в которой доступ к классу осуществляется через одноэлементное открытое свойство, которое выглядит примерно так:

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;
                }
        }

Ответ довольно прост: вы хотите получать один и тот же объект каждый раз, когда он используется.

Это дает вам преимущества быть глобальной переменной (т. е. есть только одна) с преимуществами того, чтобы быть объектом класса (помимо прочего, он может выполнять невидимую инициализацию в первый раз, когда это необходимо).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top