как лучше всего сохранить данные конфигурации в приложении c #? обратите внимание, что эти данные могут изменяться динамически. насколько я знаю, можно использовать класс ConfigurationManager. но я слышал, что это не лучший способ сделать это.
c # как лучше всего сохранить данные конфигурации в приложении c #.
Ответы (3)
Используйте встроенный механизм настроек. Но оставьте диспетчер конфигурации в покое и используйте свои настройки, например
Properties.Settings.Default.x
Нет ничего плохого в использовании 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 the
Данные конфигурации с возможностью записи на стороне сервера, хранящиеся в приложении
- Use a database or a file in
C:\ProgramData\<name of your company>\<name of your app>
- Use a database or a file in
Записываемые данные конфигурации на стороне клиента, хранящиеся в приложении (настольные приложения)
- 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)
- Use a file in
Простой способ - использовать объект данных конфигурации, сохранить его как файл 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>
Очень просто, или как вы думаете?