【问题标题】:Creating and Passing IConfiguration from a framework application从框架应用程序创建和传递 IConfiguration
【发布时间】:2020-11-05 11:56:58
【问题描述】:

在我的 .Net Framework 4.7.2 应用程序中,我正在使用一个需要配置为 IConfiguration 对象的库。我知道配置的架构,并且在我的 App.config 中包含了 xml 元素。但是现在我在解析 app.config 的这一部分并将其转换为 IConfiguration 时遇到了问题。 如果我将 xml 元素放在一个单独的 xml 文件中,我知道我可以这样做:

var config = new ConfigurationBuilder().AddXmlFile("config.xml").Build();

这会给我一个 IConfiguration 实例,但我们不希望有单独的配置文件。理想情况下使用单个 App.config。

请问我有哪些选择? 谢谢。

【问题讨论】:

    标签: .net-core app-config


    【解决方案1】:

    您可以获取 xml 的特定部分,并传递它而不是 IConfiguration,因为 IConfigurationSection 继承自 IConfiguration

    XML 示例和代码

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <mySettings>
        <setting1>test</setting1>
        <setting2>abc</setting2>
      </mySettings>
    </configuration>
    
    using Microsoft.Extensions.Configuration;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                var config = new ConfigurationBuilder().AddXmlFile("test.xml").Build();
    
                var section = config.GetSection("mySettings");
    
                MethodForIConfiguration(section); // iconfiguration parameter accepts iconfigurationsection item
    
                var settingValue = section.GetValue<string>("setting1"); // equals "test"
            }
    
            private static void MethodForIConfiguration(IConfiguration configuration)
            {
            }
        }
    }
    

    更新。我现在收到您的问题,您不能使用 App.config,因为它对 .FromXmlFile 方法无效。你可以只传递 App.config 的必需部分:读取它,选择你需要的节点,保存并作为流传递给配置生成器

    using Microsoft.Extensions.Configuration;
    using System.IO;
    using System.Linq;
    using System.Xml.Linq;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                var document = XDocument.Load("App.config");
                var node = document.Root.Descendants().Where(x => x.Name.LocalName == "mySettings").FirstOrDefault();
    
                var newDocument = new XDocument();
                newDocument.Add(node);
    
                using var ms = new MemoryStream();
                newDocument.Save(ms);
                ms.Position = 0;
    
                var config = new ConfigurationBuilder().AddXmlStream(ms).Build();
    
                var settingValue = config.GetValue<string>("setting1");
            }
        }
    }
    

    【讨论】:

    • 谢谢,我已经知道了,正如我所提到的,我不想拥有单独的 test.xml 文件,我想将这部分包含在 App.config 中。
    • 谢谢,您认为在已经知道其 app.config 的应用程序中执行此行 (var document = XDocument.Load("App.config");) 是一种干净的方式吗?
    • 我不会说它很干净,但我不确定其他选项(我还看到使用 ConfigurationManager 构建 xml/json)是否更干净。任何解决方法都可能看起来不干净,因为否则它会按设计存在
    • 谢谢,是的,理想情况下,如果有一种方法可以使用自然框架的 ConfigurationManager 并且它可以将该 configSection 转换为 IConfiguration:
    • 我认为您可以使用自己的实现来实现 IConfiguration 接口,该实现会读取 ConfigurationManager,但工作量很大
    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多