【问题标题】:How to have different parts of config file in c#如何在c#中拥有配置文件的不同部分
【发布时间】:2012-03-23 21:22:24
【问题描述】:

我想要做的是对于我的 App.config 文件,我有一堆设置,我想做的是将我的配置文件拆分为不同的文件。例如;我的 app.config 文件具有与电子邮件有关的设置,因此我想将这些设置取出并将其存储在 email.config 文件中,然后在我的 app.config 文件中使用 configSource 属性从 email.config 添加这些设置文件并将其添加到应用程序设置节点。这可能吗?

如果是这样,请就如何实现上述结果提出建议。

非常感谢。

例如,我有另一个名为 app1.config 的配置文件,并具有以下 xml:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings >
    <add key="l" value="test"/>
  </appSettings>
</configuration>

然后从我的主 app.config 文件中获得对 app1.config 文件的引用,然后从代码中能够执行此操作以获取应用设置键的值:

 var x = ConfigurationManager.AppSettings["l"];

【问题讨论】:

    标签: c# configuration-files


    【解决方案1】:

    编辑以反映已更改的问题和其他 cmets:

    对于在配置文件的&lt;appSettings&gt; 部分中定义的自定义设置,有一个file 属性可以包含覆盖appSettings 参数的文件的路径: http://www.codeproject.com/Articles/8818/Using-the-File-attribute-of-the-appSettings-elemen

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
     <appSettings file="settings.config">
     </appSettings>
    </configuration>`
    

    您确实也可以使用 MSDN 文档中指定的 configSource 属性:

    http://msdn.microsoft.com/en-us/library/system.configuration.sectioninformation.configsource.aspx

    ConfigSource 属性表示为与 SectionInformation 对象关联的 ConfigurationSection 对象指定的 configSource 属性的值。

    ConfigurationSection 实现可以选择指定一个单独的文件,其中定义了该部分的配置设置。这可以通过多种方式发挥作用:

    使用包含文件可以使配置文件的结构更加合乎逻辑和模块化。

    文件访问安全性和权限可用于限制对配置设置部分的访问。

    可以修改和重新加载应用程序初始化期间未使用的包含文件中的设置,而无需重新启动应用程序。

    以下示例显示了如何在配置文件中使用此属性来指定页面部分是在外部包含文件中定义的:

    &lt;pages configSource="pages.config"/&gt;

    或者,如果您想将同一部分的信息存储在单独的文件中,您可以随时恢复使用 ConfigurationManager.Open...Configuration 函数并以编程方式读取设置: http://msdn.microsoft.com/en-us/library/ms134262.aspx

    【讨论】:

    • 您好,谢谢您,我已经尝试过了,但我没有得到值,它返回为空。这是我的名为 App1.config 的外部配置文件,仅包含: 和我的主要配置应用程序设置部分,如下所示: 并在我后面的代码中这样做: var x = ConfigurationManager.AppSettings["d"];但它正在变得空,而不是价值。请帮忙。是提前
    • 好的,非常感谢这已经奏效了! :) 但是我可以指定多个外部配置文件吗?如果是这样,您能否建议如何完成此操作?提前致谢。
    • 刚刚又试了一次,它对我有用,您确定文件 App1.config 就位(与程序相同的目录)吗?例如,对于控制台程序,这意味着您必须将“复制到输出目录”设置为“始终复制”
    • 是的,它现在对我有用,我必须将“复制到输出目录”设置为始终复制。但现在我想拥有多个外部配置文件并从主配置文件中引用所有这些文件。这可能吗?
    • 是和否;您可以使用自定义配置部分,但必须设置一些代码才能读取它们。在任何情况下,规则始终是每个部分一个文件。或者您可以将多个 app.config 文件存储为独立的设置文件,并使用 ConfigurationManager.Open...Configuration 函数从代码中读取这些文件。
    【解决方案2】:

    您可以在自己的文件中使用 smtp settings 的内置配置部分:

    <system.net>
        <mailSettings>
          <smtp deliveryMethod="network">
            <network
              host="localhost"
              port="25"
              defaultCredentials="true"
            />
          </smtp>
        </mailSettings>
    </system.net>
    

    这可以在您的app.config 中使用configSource 引用。

    如果需要,您可以将其限制在 smtp 部分:

    <system.net>
        <mailSettings>
          <smtp configSource="smtp.config" />
        </mailSettings>
    </system.net>
    

    【讨论】:

    • 谢谢你,但电子邮件只是一个例子。我需要将它拆分为任何内容,然后从 app.config 文件中引用它。
    • @johnnie - 如果设置是在配置部分定义的,您可以这样做。如果没有,您可以随时为您的特定用途编写自己的配置部分并使用它们。这并不难,如this MSDN article 中所述。
    【解决方案3】:

    您可以使用configSource 属性来做到这一点:

     <?xml version="1.0" encoding="utf-8" ?>
     <configuration>
     <connectionStrings configSource="cs.config" />
     </configuration>
    

    【讨论】:

      【解决方案4】:

      ConfigSource 将整个部分映射到外部文件。添加后,您将无法再使用根配置文件中的部分。每个部分也不能有多个映射。

      您可以按照上面的建议创建一个自定义配置部分,其中包含要映射的部分,然后依次映射每个部分。

      web.config:

      <myConfig>
          <mysection1 file="section1.config"/>
          <mysection2 file="section2.config"/>
      </myConfig>
      

      section1.config:

      <mysection1>
          <add key="key1" value="val1"/>
      </mysection1>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-25
        • 2018-03-16
        • 2021-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-07
        相关资源
        最近更新 更多