2008-12-02 5 views
1

У нас есть файл xRppRots, содержащий путь к странице и роль пользователя, которые могут получить доступ к этой странице.Singleton vs Static Class для отображения данных, прочитанных из xml

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

На каждой странице вызывается CheckIfRoleAllowed на странице Init.

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) 
{ 
} 

} 

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

С уважением.

+0

Любой из них будет плотно связывать зависимые классы с этим классом. Спросите себя: «Как я буду тестировать класс или метод, который зависит от PageAccessChecker независимо от PageAccessChecker?»? @ Джеймс Карран - это правильно. – TrueWill 2011-09-15 14:35:38

ответ

2

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

Ваша реализация делает звонки проще, IMO:

PageAccessChecker.CheckIfRoleAllowed(path); 

вместо:

PageAccessChecker._default.CheckIfRoleAllowed(path); 
3

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

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

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

+0

Фактически, файл загружается путем вызова метода загрузки из конструктора. Когда файл изменяется, метод Changed FileSystemWatcher также вызывает тот же метод. – 2008-12-02 07:41:10

+0

Hooray for FileSystemWatcher - я собирался предложить иначе – annakata 2008-12-02 09:00:32

3

На самом деле вы действительно не хотите ни одноэлементный, ни статический класс.

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

Одноэлементный объект предназначен для объектов, которые может быть только одним, а не для объектов, где требуется только один. Здесь не так. В этой ситуации нет ничего, что требует синглтона. То, что вы на самом деле хотите, это вещь, называемая глобальной переменной ".

«Но, подождите!» ты говоришь. «Не глобальные переменные злые?» Ну, да, есть. Но это не имеет значения. Если вы называете это статическим классом или синглом или что-то еще, то, что вы на самом деле здесь, - это глобальная переменная. Называть это чем-то другим, ничего не изменит.

+0

Это не так уж просто: что GlobalVar будет типом класса, поэтому вы * смотрите * на один сингл в реализации, а imho гораздо лучше справляется с интерфейсом мост, чем с фактической глобальной ссылкой – annakata 2008-12-02 09:03:42

-1

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

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

Но вы действительно должны стараться избегать одиночных игр и вместо этого использовать инъекцию зависимостей. См. Singletons are Pathological Liars от Miško Hevery.