【问题标题】:c# what is the best way to save configuration data in c# application. [duplicate]c# 在 c# 应用程序中保存配置数据的最佳方法是什么。 [复制]
【发布时间】:2016-03-18 06:09:25
【问题描述】:

在 C# 应用程序中保存配置数据的最佳方式是什么? 请注意,这些数据可能会动态更改。 据我所知,可以使用 ConfigurationManager 类。但我听说这不是好方法。

【问题讨论】:

标签: c#


【解决方案1】:

使用内置的设置机制。但是不要管配置管理器并使用您的设置,例如

Properties.Settings.Default.x 

【讨论】:

    【解决方案2】:

    使用 ConfigurationManager (web.config/app.config) 没有任何问题。 对于不同类型的配置数据,我推荐如下;

    • 永不改变的只读配置数据

      • 应用程序或使用(程序集级)属性中的硬编码。这 配置数据时需要重新编译/重新安装应用程序 变化。
    • 几乎不会改变的只读配置数据

      • 使用<appSettings><connectionStrings> 或 web.config/app.config 中的其他部分(更改时通常需要重新启动应用程序,尤其是在启动期间配置数据只读时)
    • 应用程序中维护的服务器端可写配置数据

      • 使用C:\ProgramData\<name of your company>\<name of your app>中的数据库或文件
    • 在应用程序(桌面应用程序)中维护的客户端可写配置数据

      • 使用C:\Users\<clients login name>\AppData\Local\<name of your company>\<name of your app>\ 中的文件。如果您需要配置数据在其他计算机上可用(使用相同的 AD 域),请改用 AppData 下的 LocalRoaming 文件夹(不要在此处放置的文件中放置太多配置数据,因为它们需要在计算机之间传输)

    【讨论】:

    • 我的印象是,如果您只进行“正常”配置,您应该坚持使用 ConfigurationManager。如果您需要 Asp.net 特定的配置机制(如配置继承),请切换到 WebConfigurationManager。通过仅使用 ConfigurationManager,可以更轻松地在桌面和 Web 场景中使用类库,而无需检查您的代码在什么环境中运行。
    • 只是引用手册中的内容。不过我同意,将一个配置系统与一个正在制作的应用程序的类型紧密耦合是绝对荒谬的。随时给我独立的存储和二进制写入器。
    • 为此点赞:)
    【解决方案3】:

    一种简单的方法是使用配置数据对象,将其保存为带有应用程序名称的 xml 文件,并在启动时将其读回。

    这是一个存储表单位置和大小的示例。

    配置数据对象是强类型且易于使用:

    [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>
    

    很简单,或者你怎么看?

    【讨论】:

    • 不要那样做。使用框架中已经内置的非常好的集成设置机制。
    • 我不得不承认,看到你的答案发布得如此之快,我怀疑这是不是抄袭。然后我意识到你发布了同样的东西here。 :)
    • @Lee 不,这是我写的,最初是为了另一个帖子。所以 ist 已经准备好了。
    • @Thorsten 很好的想法是,你有编译器具有强类型保存的数据对象和 xcopy 部署的可能性。
    • 我意识到这一点。 :) 如果您认为您的旧答案可以回答问题,您最好将帖子标记为重复(我做过)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    相关资源
    最近更新 更多