Синглтон против статического класса для предоставления данных, прочитанных из XML - PullRequest
1 голос
/ 02 декабря 2008

У нас есть XML-файл PageRoles, который содержит путь к странице и роль пользователя, которая может получить доступ к этой странице.

Мы поддерживаем словарь в статическом классе, который загружается в статический конструктор класса. В классе есть метод CheckIfRoleAllowed, который принимает путь к странице и возвращает логическое значение.

Каждая страница вызывает метод CheckIfRoleAllowed для инициализации страницы.

static class PageAccessChecker
{
 static Dictionary<string, UserRoleType[]> _PageAccessPermissions;
 static FileSystemWatcher _XmlWatcher;

 static PageAccessChecker()
 {
   // Load page access permissions from xml
   // Set FileSystemWatcher watcher to watch for changes
 }

 public static CheckIfRoleAllowed(string pagePath)
 {
 }

}

Было бы лучше, если бы мы делали это с использованием шаблона синглтона? Если да, то почему?

С уважением.

Ответы [ 4 ]

3 голосов
/ 02 декабря 2008

Я вижу два преимущества использования одноэлементного шаблона (если он реализован, скажем, через статическое свойство):

  1. вы можете отложить загрузку XML-файла, пока не получите доступ к первой странице.
  2. Вы можете проверить, изменился ли файл XML на диске, и автоматически перезагрузить его при следующем доступе.

Недостатком может быть то, что вам нужно сделать доступ потокобезопасным с помощью блокировки.

3 голосов
/ 02 декабря 2008

На самом деле вам не нужен ни синглтон, ни статический класс.

Прежде всего, статический класс является синглтоном. Я думаю, что вы на самом деле спрашиваете: «Является ли выгодным добавить ригмарол, чтобы гарантировать, что это угроза безопасна и существует только один, или, другими словами, мне нужен« специальный »синглтон? На что ответ «Нет», так как вам не нужен синглтон.

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

"Но, подождите !!!" ты говоришь. "Разве глобальные переменные не являются злом?" Ну да, есть. Но это не имеет значения здесь. Назовите ли вы это статическим классом или одиночным или каким-либо другим, то, что вы на самом деле имеете здесь , является глобальной переменной. Называя это чем-то другим, ничего не изменится.

2 голосов
/ 02 декабря 2008

Вы используете синглтон. Проще говоря, есть две обычные реализации для синглетов, другая - создание экземпляра класса и наличие статического члена, ссылающегося на этот экземпляр.

Ваша реализация упрощает вызовы IMO:

PageAccessChecker.CheckIfRoleAllowed(path);

вместо:

PageAccessChecker._default.CheckIfRoleAllowed(path);
0 голосов
/ 02 декабря 2008

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

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

Но на самом деле вам следует избегать синглетонов и использовать вместо этого внедрение зависимостей. См. Синглтоны - патологические лжецы . Автор Miško Hevery.

...