.Net 8进阶——配置组件

420 阅读1分钟

使用Microsoft.Extensions.Configuration读取jsonxmlyaml、命令行配置,同时进行自定义配置读取。

1、json配置读取

appsettings.json(属性还需要选择-> 高级 -> 复制到输出目录)
{
  "Logging": {
    "LogLevel": {
      "Default": "Information"
    }
  },
  "ApplicationSettings": {
    "AppName": "MyConsoleApp",
    "Version": "1.0"
  }
}
② 安装相应依赖
Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.Configuration.Binder
Install-Package Microsoft.Extensions.Configuration.Json
③ 直接读取Json的具体数据
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.AddJsonFile("appsettings.json");
IConfiguration configuration = builder.Build();
​
string ApplicationName = configuration["ApplicationSettings:AppName"];
string ApplicationVersion = configuration["ApplicationSettings:Version"];
​
Console.WriteLine($"ApplicationName:{ApplicationName}");
Console.WriteLine($"ApplicationVersion:{ApplicationVersion}");
④ 保存Json数据到内存
// 定义Json对应的数据结构
public class AppSettings
{
    public AppSettings()
    {
        Logging = new LoggingSettings();
        Application = new ApplicationSettings();
    }
​
    public LoggingSettings Logging { get; set; }
    public ApplicationSettings Application { get; set; }
}
​
public class LogLevel
{
    public string Default { get; set; }
}
​
public class LoggingSettings
{
    public LoggingSettings()
    {
        LogLevel = new LogLevel();
    }
​
    public LogLevel LogLevel { get; set; }
}
​
public class ApplicationSettings
{
    public string AppName { get; set; }
    public string Version { get; set; }
}
using Microsoft.Extensions.Configuration;
​
var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
​
IConfiguration configuration = builder.Build();
​
AppSettings appSettings = new AppSettings();
configuration.GetSection("Logging").Bind(appSettings.Logging);
configuration.GetSection("ApplicationSettings").Bind(appSettings.Application);
​
Console.WriteLine($"Log Level: {appSettings.Logging.LogLevel.Default}");
Console.WriteLine($"App Name: {appSettings.Application.AppName}");
Console.WriteLine($"App Version: {appSettings.Application.Version}");

2、xml配置读取

application.xml(属性还需要选择-> 高级 -> 复制到输出目录)
<Configuration>
    <ApplicationSettings>
        <AppName>MyConsoleApp</AppName>
        <Version>1.0</Version>
    </ApplicationSettings>
    <Logging>
        <LogLevel>
            <Default>Information</Default>
        </LogLevel>
    </Logging>
</Configuration>
② 安装相应的依赖
Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.Configuration.Binder
Install-Package Microsoft.Extensions.Configuration.Xml
③ 直接读取xml的具体数据
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.AddXmlFile("appsettings.xml");
IConfiguration configuration = builder.Build();
​
string ApplicationName = configuration["ApplicationSettings:AppName"];
string ApplicationVersion = configuration["ApplicationSettings:Version"];
​
Console.WriteLine($"ApplicationName:{ApplicationName}");
Console.WriteLine($"ApplicationVersion:{ApplicationVersion}");
④ 保存Xml数据到内存
using Microsoft.Extensions.Configuration;
​
var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddXmlFile("appsettings.xml", optional: false, reloadOnChange: true);
​
IConfiguration configuration = builder.Build();
​
AppSettings appSettings = new AppSettings();
configuration.GetSection("Logging").Bind(appSettings.Logging);
configuration.GetSection("ApplicationSettings").Bind(appSettings.Application);
​
Console.WriteLine($"Log Level: {appSettings.Logging.LogLevel.Default}");
Console.WriteLine($"App Name: {appSettings.Application.AppName}");
Console.WriteLine($"App Version: {appSettings.Application.Version}");

3、yaml配置读取

application.yaml(属性还需要选择-> 高级 -> 复制到输出目录)
Logging:
  LogLevel: 
    Default: "Information"
ApplicationSettings: 
  AppName: "MyConsoleApp"
  Version: "1.0"
② 安装相应依赖
Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.Configuration.Binder
Install-Package Microsoft.Extensions.Configuration.Yaml
③ 直接读取yaml的具体数据
// 1、构造配置对象
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.AddYamlFile("appsettings.yaml");
IConfiguration configuration = builder.Build();
​
// 2、读取配置信息
string ApplicatoinName = configuration["ApplicationSettings:AppName"];
string Version = configuration["ApplicationSettings:Version"];
​
Console.WriteLine($"AppName:{ApplicatoinName}");
Console.WriteLine($"Version:{Version}");
④ 保存yaml数据到内存
using Microsoft.Extensions.Configuration;
​
var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddYamlFile("appsettings.yaml", optional: false, reloadOnChange: true);
​
IConfiguration configuration = builder.Build();
​
AppSettings appSettings = new AppSettings();
configuration.GetSection("Logging").Bind(appSettings.Logging);
configuration.GetSection("ApplicationSettings").Bind(appSettings.Application);
​
Console.WriteLine($"Log Level: {appSettings.Logging.LogLevel.Default}");
Console.WriteLine($"App Name: {appSettings.Application.AppName}");
Console.WriteLine($"App Version: {appSettings.Application.Version}");

4、命令行读取

① 安装相应依赖
Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.Configuration.CommandLine
② 直接读取命令行的数据
using Microsoft.Extensions.Configuration;
​
IConfiguration configuration = new ConfigurationBuilder().AddCommandLine(args).Build();
string myOption = configuration.GetValue<string>("myOption"); 
bool verbose = configuration.GetValue<bool>("verbose"); 
Console.WriteLine(myOption);
Console.WriteLine(verbose);

4、自定义配置读取

Logging.LogLevel.Default=Information
ApplicationSettings.AppName=MyConsoleApp
ApplicationSettings.Version=1.0
using Microsoft.Extensions.Configuration;
​
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.AddText("appsettings.txt");
IConfiguration configuration = builder.Build();
​
string LoggerLevel = configuration.GetValue<string>("Logging.LogLevel.Default");
string AppplicationName = configuration.GetValue<string>("ApplicationSettings.AppName");
string ApplicationVerison = configuration.GetValue<string>("ApplicationSettings.Version");
​
Console.WriteLine($"Logging.LogLevel.Default => {LoggerLevel}");
Console.WriteLine($"ApplicationSettings.AppName =>  { AppplicationName}");
Console.WriteLine($"ApplicationSettings.Version =>  { ApplicationVerison}");
​
public static class TextConfigurationExtensions
{
    public static IConfigurationBuilder AddText(this IConfigurationBuilder configurationBuilder, string FilePath)
    {
        TextConfigurationSource source = new TextConfigurationSource(FilePath);
        return configurationBuilder.Add(source);
    }
}
​
public class TextConfigurationProvider: ConfigurationProvider
{
    public TextConfigurationSource Source { get; set; }
    public TextConfigurationProvider(TextConfigurationSource source)
    {
        this.Source = source;
    }
​
    public override void Load()
    {
        var data = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
​
        if (!File.Exists(Source.FilePath))
        {
            throw new FileNotFoundException($"Configuration 文件 '{Source.FilePath}' 没有发现");
        }
​
        var lines = File.ReadAllLines(Source.FilePath);
​
        foreach (var line in lines)
        {
            var keyValuePair = line.Split('=');
            if (keyValuePair.Length == 2)
            {
                data.Add(keyValuePair[0].Trim(), keyValuePair[1].Trim());
            }
        }
​
        this.Data = data;
    }
}
​
public class TextConfigurationSource: IConfigurationSource
{
    public string FilePath { get; set; }
​
    public TextConfigurationSource(string filePath)
    {
        this.FilePath = filePath;
    }
​
    public IConfigurationProvider Build(IConfigurationBuilder builder)
    {
        return new TextConfigurationProvider(this);
    }
}