Подтвердить что ты не робот

Singleton для настройки приложения

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

Спасибо в Advance

Мадху

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

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

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

Ответ 4

Кажется, что одноэлементный шаблон - это путь. Здесь Setting класс, который я написал, что хорошо работает для меня.