c # как лучше всего сохранить данные конфигурации в приложении c #.

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


c#
person Farid Moraveji    schedule 12.12.2015    source источник
comment
Я предлагаю настройки приложения и пользователя: msdn.microsoft .com / ru-ru / library / bb397750 (версия = 110) .aspx   -  person ne1410s    schedule 12.12.2015
comment
как лучше всего - подразумевает мнение и, следовательно, возможно, не по теме для SO   -  person MickyD    schedule 12.12.2015


Ответы (3)


Используйте встроенный механизм настроек. Но оставьте диспетчер конфигурации в покое и используйте свои настройки, например

Properties.Settings.Default.x 
person Thorsten Dittmar    schedule 12.12.2015

Нет ничего плохого в использовании ConfigurationManager (web.config / app.config). Для различных типов данных конфигурации я рекомендую следующее;

  • Неизменяемые данные конфигурации, доступные только для чтения

    • Hardcode in application or use (assembly-level) attributes. This requires a recompile/re-installation of app when configuration-data changes.
  • Практически никогда не меняются данные конфигурации, доступные только для чтения

    • Use the <appSettings>, <connectionStrings> or other sections in web.config/app.config (Often requires a restart of app when changed, especially when configuration-data is read only during startup)
  • Данные конфигурации с возможностью записи на стороне сервера, хранящиеся в приложении

    • Use a database or a file in C:\ProgramData\<name of your company>\<name of your app>
  • Записываемые данные конфигурации на стороне клиента, хранящиеся в приложении (настольные приложения)

    • Use a file in C:\Users\<clients login name>\AppData\Local\<name of your company>\<name of your app>\. If you need configuration data to be available on other computers (using the same AD domain), use the LocalRoaming folder under AppData instead (don't place too much configuration data in files placed here, tho because they need to be transferred between computers)
person Frode    schedule 12.12.2015
comment
У меня создалось впечатление, что вам следует придерживаться ConfigurationManager, если вы выполняете только обычную настройку. Если вам нужны специальные механизмы конфигурации Asp.net (например, наследование конфигурации), переключитесь на WebConfigurationManager. Используя только ConfigurationManager, проще использовать библиотеки классов в настольных и веб-сценариях без необходимости проверять, в какой среде выполняется ваш код. - person Frode; 12.12.2015
comment
Просто процитирую то, что написано в руководстве. Я согласен с тем, что это абсолютно нелепо, что система конфигурации тесно связана с типом приложения, которое оно создает. Дайте мне изолированное хранилище и двоичные писатели в любой момент. - person MickyD; 12.12.2015
comment
Большие пальцы за это :) - person Frode; 12.12.2015

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

Вот пример сохранения положения и размера формы.

Объект данных config строго типизирован и прост в использовании:

[Serializable()]
public class CConfigDO
{
    private System.Drawing.Point m_oStartPos;
    private System.Drawing.Size m_oStartSize;

    public System.Drawing.Point StartPos
    {
        get { return m_oStartPos; }
        set { m_oStartPos = value; }
    }

    public System.Drawing.Size StartSize
    {
        get { return m_oStartSize; }
        set { m_oStartSize = value; }
    }
}

Класс менеджера для сохранения и загрузки:

public class CConfigMng
{
    private string m_sConfigFileName = System.IO.Path.GetFileNameWithoutExtension(System.Windows.Forms.Application.ExecutablePath) + ".xml";
    private CConfigDO m_oConfig = new CConfigDO();

    public CConfigDO Config
    {
        get { return m_oConfig; }
        set { m_oConfig = value; }
    }

    // Load configfile
    public void LoadConfig()
    {
        if (System.IO.File.Exists(m_sConfigFileName))
        {
            System.IO.StreamReader srReader = System.IO.File.OpenText(m_sConfigFileName);
            Type tType = m_oConfig.GetType();
            System.Xml.Serialization.XmlSerializer xsSerializer = new System.Xml.Serialization.XmlSerializer(tType);
            object oData = xsSerializer.Deserialize(srReader);
            m_oConfig = (CConfigDO)oData;
            srReader.Close();
        }
    }

    // Save configfile
    public void SaveConfig()
    {
        System.IO.StreamWriter swWriter = System.IO.File.CreateText(m_sConfigFileName);
        Type tType = m_oConfig.GetType();
        if (tType.IsSerializable)
        {
            System.Xml.Serialization.XmlSerializer xsSerializer = new System.Xml.Serialization.XmlSerializer(tType);
            xsSerializer.Serialize(swWriter, m_oConfig);
            swWriter.Close();
        }
    }
}

Теперь вы можете использовать его в своей форме в событиях загрузки и закрытия:

    private void Form1_Load(object sender, EventArgs e)
    {
        // Load config
        oConfigMng.LoadConfig();
        if (oConfigMng.Config.StartPos.X != 0 || oConfigMng.Config.StartPos.Y != 0)
        {
            Location = oConfigMng.Config.StartPos;
            Size = oConfigMng.Config.StartSize;
        }
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        // Save config
        oConfigMng.Config.StartPos = Location;
        oConfigMng.Config.StartSize = Size;
        oConfigMng.SaveConfig();
    }

И созданный файл xml также доступен для чтения:

<?xml version="1.0" encoding="utf-8"?>
<CConfigDO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <StartPos>
    <X>70</X>
    <Y>278</Y>
  </StartPos>
  <StartSize>
    <Width>253</Width>
    <Height>229</Height>
  </StartSize>
</CConfigDO>

Очень просто, или как вы думаете?

person Dieter Meemken    schedule 12.12.2015
comment
Не делай этого. Используйте хорошо интегрированный механизм настроек, который уже встроен в фреймворк. - person Thorsten Dittmar; 12.12.2015
comment
Должен признаться, увидев ваш ответ, опубликованный так быстро, я подумал, не плагиат ли это. Потом я понял, что вы разместили то же самое здесь. :) - person Wai Ha Lee; 12.12.2015
comment
@Lee Нет, это написано мной, изначально для другого поста. Итак, ист был готов вручную. - person Dieter Meemken; 12.12.2015
comment
@Thorsten Хорошая мысль об этом заключается в том, что у вас есть объект данных со строгим сохранением типа компилятором и возможностью развертывания xcopy. - person Dieter Meemken; 12.12.2015
comment
Я это понимаю. :) вам, вероятно, лучше пометить сообщение как дубликат (я сделал), если вы думаете, что ваш старый ответ даст ответ на вопрос. - person Wai Ha Lee; 12.12.2015
comment
Механизм настроек также безопасен по типу. И он поддерживает все виды развертывания. Esp. ClickOnce невозможно с вашим решением, и автоматическое обновление настроек также не поддерживается. - person Thorsten Dittmar; 12.12.2015