在我的.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的必需部分:读取它,选择您需要的节点,保存并作为流传递给配置生成器
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");
}
}
}