Синглтон для настройки приложения - PullRequest
28 голосов
/ 17 декабря 2008

Во всех моих проектах до сих пор я использую шаблон синглтона для доступа к конфигурации приложения по всему приложению. В последнее время я вижу много статей о том, чтобы не использовать шаблон синглтона, потому что этот шаблон не способствует тестируемости и скрывает зависимость компонента. Мой вопрос заключается в том, каков наилучший способ хранения конфигурации приложения, которая легко доступна по всему приложению, не передавая объект конфигурации по всему приложению?.

Заранее спасибо

Мадху

Ответы [ 5 ]

21 голосов
/ 17 декабря 2008

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

РЕДАКТИРОВАТЬ Мы живем и учимся. Хотя я думаю, что конфигурация приложения - это одно из немногих мест, где можно использовать Singleton, я больше этим не занимаюсь. Как правило, сейчас я создам интерфейс и реализацию стандартного класса, используя статические, Lazy<T> вспомогательные поля для свойств конфигурации. Это позволяет мне иметь поведение «инициализировать один раз» для каждого свойства с лучшим дизайном для тестируемости.

6 голосов
/ 19 декабря 2008

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

1 голос
/ 17 декабря 2008

Для этой конкретной ситуации я бы создал один объект конфигурации и передал его тем, кто в нем нуждается.

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

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

Прочитайте обсуждение о том, почему они считаются вредными. Я думаю, что большинство проблем возникает, когда синглтон удерживает много ресурсов.

Для конфигурации приложения, я думаю, было бы безопасно сохранить его таким, как есть.

0 голосов
/ 04 марта 2011

Вот пример, сделанный с использованием Castale.Core >> DictionaryAdapter и StructureMap

0 голосов
/ 01 марта 2009

Шаблон синглтона, кажется, путь. Вот Setting класс , который я написал, который хорошо работает для меня.

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