【问题标题】:Should I add a custom section to app.config? If so, how?我应该向 app.config 添加自定义部分吗?如果是这样,怎么做?
【发布时间】:2011-12-30 09:41:13
【问题描述】:

我有一个程序会定期轮询某个文件夹中的日志文件。当它找到一个日志文件时,它会读取它,做它必须做的任何事情,然后继续前进。写入日志文件的程序一直在追加,而不是覆盖,所以我存储了最后修改日期和书签行,这是我上次阅读文件时的位置。到目前为止一切顺利。

现在,我想保留我的书签信息,这样如果我关闭轮询应用程序并重新启动它,它就不会在每个日志文件的开头重新启动。我不想麻烦将信息存储在数据库中;一个简单的 XML 文件就可以了。所以我考虑将信息存储在app.config 文件中。

第一个问题是,这是一个错误的做法吗? app.config 是不是只能在运行时读取而不是写入?在这种情况下,合乎逻辑的答案是简单地编写一个单独的 xml 文件?

其次,如果可以这样做:我找到了一篇关于 how to make a custom config section 的不错的博客文章,但它似乎搞砸了应用程序的其他部分尝试使用 ConfigurationManager.AppSettings.Get(key) 读取配置文件,@987654325 @, message = "配置系统初始化失败"。该怎么办?

【问题讨论】:

    标签: c# app-config configuration-files


    【解决方案1】:

    我会将其存储为与 app.config 不同的文件 - 在我看来,它不像配置数据。您可以使用 Xml 序列化、Yaml、Json,甚至(拜托,上帝,不)二进制序列化,并将其与 exe 一起存储(如果您在那里有写权限)或 Environment.SpecialFolder 枚举中的某个位置。

    【讨论】:

      【解决方案2】:

      ConfigurationManager 是最简单的方法。我正在使用它,但这是一个问题。你必须知道值是什么类型:

      <configuration>
        <appSettings>
          <add key="MyPropertyOne" value="Hello" />
          <add key="MyPropertyTwo" value="2" />
        </appSettings> 
      </configuration>
      
      string propertyOne = (string)ConfigurationManager.AppSettings["MyPropertyOne"];
      int propertyTwo = (int)ConfigurationManager.AppSettings["MyPropertyTwo"];
      

      但是你自己写a complex custom configuration section

      【讨论】:

        【解决方案3】:

        是的,我建议您使用自定义部分 - 它可以让您灵活地拥有对您有意义的结构。内置的 &lt;appSettings&gt; 是 a) 仅字符串,b) 只是一组键(及其值)的“平面”列表。

        您应该在 CodeProject 上查看 Jon Rista 关于 .NET 2.0 配置的三部分系列。

        强烈推荐,写得很好,非常有帮助! Jon 很好地展示了如何构建您自己的自定义配置部分,以及如何在代码中表示它。

        正如 jgauffin 已经提到的 - 还有 Configuration Section Designer 工具可以帮助您快速完成工作(但它确实有助于了解 CSD 正在做什么 - 所以请花时间阅读Jon 的三篇文章,然后使用 CSD)。

        【讨论】:

          【解决方案4】:

          自定义部分是一个很棒的工具!不要将 appSettings 用于严肃的应用程序。

          这是自定义部分的代码 在 WEB.CONFIG 中

          <configuration> 
            <configSections>
              <section name="Misc" type="Config"/>    <<-- this registers a custom section called Misc
              <Misc configSource="config_misc.config"/> <<-- this says to look for for it in file "config_misc.config"
              (...)
          

          然后在你网站的根目录下创建一个文件CONFIG_MISC.CONFIG并放进去

          <Misc 
              MySetting1="true" 
           />
          

          然后在你的 webapp 中,在 APP_CODE 文件夹中,创建一个像这样的类:

          using System;
          using System.Collections;
          using System.Configuration;
          using System.Xml;
          using System.Collections.Specialized; 
          
          
          public class Config : ConfigurationSection
          {
              private static string _CONFIG_SECTION = "Misc";
          
              #region singleton implementation
              private static Config _config;
              static Config()
              {
                  _config = (Config)ConfigurationSettings.GetConfig(_CONFIG_SECTION);
              }
              #endregion 
          
              public static bool MySetting1
              {
                  get
                  {
                      return _config._MySetting1;
                  }
              }
          
              #region public properties the define the config items we are looking for
              [ConfigurationProperty("MySetting1", IsRequired = false)]
              public bool _MySetting1
              {
                  get
                  {
                      return (bool)this["MySetting1"];
                  }
              }        
              #endregion
          } 
          

          此代码是我的代码的副本,因此在剪切时,我可能犯了一个错误,但它应该可以帮助您入门。

          您现在可以通过 Config.MySetting1 以一种非常简单的方式访问您的设置

          将您的设置分解为更多 .config 文件也有很多好处,尤其是在维护和模块化方面

          【讨论】:

            【解决方案5】:

            【讨论】:

              猜你喜欢
              • 2014-08-30
              • 1970-01-01
              • 1970-01-01
              • 2021-06-30
              • 2011-09-03
              • 2011-12-26
              • 2020-05-24
              • 1970-01-01
              • 2014-02-05
              相关资源
              最近更新 更多