Singleton Data Access Layers - PullRequest
       6

Singleton Data Access Layers

3 голосов
/ 31 октября 2008

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

public static CustomerController Instance
        {
            get 
            {
                lock(singletonLock)
                {
                    if( _instance == null )
                    {
                        _instance = new CustomerController();  
                    }
                    return _instance;
                }
            }
        }

Теперь я понимаю, что делает код, но мне было интересно, почему вы делаете это, просто создавая экземпляр класса каждый раз, когда он используется?

Ответы [ 3 ]

2 голосов
/ 31 октября 2008

РЕДАКТИРОВАТЬ: Ой, я не уловил часть «Уровни доступа к данным». Но у меня также есть пример этого: если ваше многопоточное приложение направляет все свои вызовы базы данных через одноэлементный класс, только один поток когда-либо будет обращаться к базе данных одновременно, избегая условий гонки.

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

Есть много классных причин использовать синглтон, но я был похож на вас и не знал, для чего они предназначены, пока не столкнулся с этой проблемой с доступом к файлам в многопоточном приложении.

1 голос
/ 31 октября 2008

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

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

1 голос
/ 31 октября 2008

Возможно, вы захотите сделать это также, с двойной проверкой блокировки, это ускорит доступ к вашему синглтону

 public static CustomerController Instance
        {
                get 
                {
                        if( _instance == null )
                        {
                           lock(singletonLock)
                           {
                                if( _instance == null )
                                {
                                        _instance = new CustomerController();  
                                }

                            }
                        }   
                        return _instance;
                }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...