从框架应用程序创建和传递 IConfiguration

Creating and Passing IConfiguration from a framework application

在我的 .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.

请问我有哪些选择? 谢谢

您可以获得 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 的必需部分:阅读它,您需要的 select 个节点,保存并作为流

传递给配置构建器
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");
        }
    }
}