从框架应用程序创建和传递 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");
}
}
}
在我的 .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");
}
}
}