Сохранение настроек пользователя.конфиг


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

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

public static class UserSettings
{
    public static string ProcessPath
    {
        get { return _processPath; }
        set 
        { 
            _processPath = Settings.Default.ProcessPath = value;
            Settings.Default.Save();
        }
    }
    //Other functions and properties
}

Да, я знаю, это пахнет. Я чувствую стыд. Я хочу сделать это правильно. Я думаю так:

  • класс является статическим, оно должно по крайней мере быть одноэлементный;
  • объект должен сам не быть статичной;
  • нет смысла сохранять настройки каждый раз, только при закрытии приложения, и что бы в принципе быть безопасным в деструктор класса , лучше всего подходит для специальная функция под названием Поль. Любой другой объект может вызвать его, когда они считают нужным, никого не удивишь эффектами. (еще одно доказательство необходимости синглтон).

Эти благие намерения в правильном направлении?



9241
2
c#
задан 28 сентября 2011 в 06:09 Источник Поделиться
Комментарии
3 ответа

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

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

Лично я бы, наверное, сменить его в статический класс с именем ProcessPath к нормальному классу по имени (как-то так) config_string, с экземпляром для ProcessPath, и другие экземпляры, содержащие другие строки. Чтобы сделать это, вам нужно пройти настройки.По умолчанию.ProcessPath в качестве параметра при создании объекта.

1
ответ дан 28 сентября 2011 в 07:09 Источник Поделиться

Я понимаю вашу идею. Вы должны использовать обе модели: паттерн Singleton, и загрузить/сохранить шаблон.

Вы можете использовать UserSettings класс реализации, с загрузить/сохранить функциональность, унаследованные от свойство applicationsettingsbase класс.

Пример использования UserSettings одноэлементного класса в Windows формы приложения:

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.Location = UserSettings.Default.FormLocation;
this.Size = UserSettings.Default.FormSize;
this.textBox1.Text = UserSettings.Default.ProcessPath;
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
UserSettings.Default.FormLocation = this.Location;
UserSettings.Default.FormSize = this.Size;
UserSettings.Default.ProcessPath = this.textBox1.Text;
UserSettings.Default.Save();
}
}

Источники:

[SettingsSerializeAs(SettingsSerializeAs.Xml)]
public sealed class UserSettings : ApplicationSettingsBase, INotifyPropertyChanged, ISerializable
{
private static UserSettings _defaultInstance = new UserSettings();

[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
info.SetType(typeof(SingletonSerializationHelper));
}

private UserSettings() { }

public static UserSettings Default { get { return _defaultInstance; } }

private const string FormLocationProperty = "FormLocation";
private const string FormSizeProperty = "FormSize";
private const string ProcessPathProperty = "ProcessPath";

// public properties
[UserScopedSetting()]
[DefaultSettingValue("0, 0")]
public Point FormLocation
{
get { return (Point)(this[FormLocationProperty]); }
set { this[FormLocationProperty] = value; }
}

[UserScopedSetting()]
[DefaultSettingValue("300, 300")]
public Size FormSize
{
get { return (Size)this[FormSizeProperty]; }
set { this[FormSizeProperty] = value; }
}

[UserScopedSetting]
[DefaultSettingValue("")]
public string ProcessPath
{
get { return (string)this[ProcessPathProperty]; }
set { this[ProcessPathProperty] = value; }
}
}

[Serializable]
internal sealed class SingletonSerializationHelper : IObjectReference
{
public object GetRealObject(StreamingContext context)
{
return UserSettings.Default;
}
}

1
ответ дан 29 сентября 2011 в 06:09 Источник Поделиться

Вот коды я использую -

Для предотвращения ввода "параметры.По умолчанию":

using Res = MyApp.Properties.Resources;
using Set = MyApp.Properties.Settings;

/// in class
private static Set def{
get{
return Set.Default;
}
}
// usage
def.Data="blah"

А потом взгляните на

public event SettingChangingEventHandler SettingChanging

в свойство applicationsettingsbase

0
ответ дан 13 января 2012 в 02:01 Источник Поделиться