Использовать настройки напрямую или через класс-оболочку? - PullRequest
1 голос
/ 31 декабря 2010

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

Разве класс «Настройки» уже не является синглтоном?

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {

    private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));

    public static Settings Default {
        get {
            return defaultInstance;
        }
    }
// rest of class...
}

.
.
.
Итак, в чем преимущество упаковки настроек в другом классе и выполнения этого:

int foo = MySettingsWrapper.MyInt;

вместо того, чтобы делать это непосредственно там, где это необходимо:

int foo = Settings.Default.MyInt;

Ответы [ 3 ]

2 голосов
/ 01 января 2011

Класс Settings сам по себе не является синглтоном. Вы могли бы сделать:

var s1 = new Settings();
var s2 = new Settings();
var s3 = new Settings();

Тем не менее, я считаю, что это не принесет вам большой пользы, поскольку AFAIK значения s1, s2 и s3 будут сохранены в одном и том же месте:

c:\Documents and Settings>\<username>\[Local Settings\]Application Data\<companyname>\<appdomainname>_<eid>_<hash>\<verison>\user.config

Так что я подозреваю:

s1.MyInt = 1;
s1.Save();

будет таким же, как

s2.MyInt = 1;
s2.save();

По этой причине вы получаете статическое свойство Settings.Default, которое возвращает один потокобезопасный экземпляр. Я использую это все время как есть, не вижу никакой причины, чтобы обернуть это. Однако вам может потребоваться расширить , например, если вы хотите контролировать расположение user.config: Как сделать сгенерированные дизайнером параметры приложения .Net переносимыми

1 голос
/ 31 декабря 2010

Это тип внедрения зависимостей.

Settings.Default - это 1 тип реализации механизма настроек.

Добавление оболочки означает, что код реализации находится в одном месте, а не в вашейcode.

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

Может быть излишним.Вам нужно решить, нужно ли вам когда-либо менять эту реализацию.Но подумайте об этом, вы можете в дальнейшем найти какую-то другую систему, которая может потребоваться для доступа к этим настройкам (SQL Jobs, Remote Services и т. Д.).

Обычно эта «оболочка» должна быть реализацией интерфейсаи вы бы использовали инверсию контейнера управления (например, Castle.Windsor), чтобы внедрить реализацию в среду выполнения.

0 голосов
/ 22 декабря 2016

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

...