使用命令行方式配置
引用命令行包:Microsoft.Extensions.Configuration.CommandLine
所有引用的包如下所示:
如果要使用命令行的形式配置上图的参数,程序运行后,参数传递方式如下图所示:
ConfigOptions.exe是项目的名称,后面的name,age等都是要传递的参数。
完整代码:
Program.cs
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
namespace ConfigOptions
{
class Program
{
static void Main(string[] args)
{
{
ServiceCollection services = new ServiceCollection();
services.AddScoped<ConfigTest>();//往DI容器中注册自定义类
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
//configurationBuilder.AddJsonFile("config.json", optional: true, reloadOnChange: true);
configurationBuilder.AddCommandLine(args);
IConfigurationRoot root = configurationBuilder.Build();
//将Options添加到DI容器中
//将ConfigJson对象绑定到根节点上面
services.AddOptions().Configure<ConfigJson>(e => root.Bind(e));
using (var sp = services.BuildServiceProvider())
{
var c = sp.GetRequiredService<ConfigTest>();
c.Show();
Console.ReadKey();
}
}
}
}
class ConfigJson
{
public string name { get; set; }
public string age { get; set; }
public Proxy proxy { get; set; }
}
class Proxy
{
public string address { get; set; }
public int port { get; set; }
}
}
ConfigTest.cs
using Microsoft.Extensions.Options;
using System;
namespace ConfigOptions
{
class ConfigTest
{
private readonly IOptionsMonitor<ConfigJson> options;
public ConfigTest(IOptionsMonitor<ConfigJson> options)
{
this.options = options;
}
public void Show()
{
Console.WriteLine(options.CurrentValue.name);
Console.WriteLine(options.CurrentValue.age);
Console.WriteLine(options.CurrentValue.proxy.address);
Console.WriteLine(options.CurrentValue.proxy.port);
}
}
}
如果是在开发过程中调试程序,除了上面在命令行窗口中输入参数外,还可以在vs中直接将参数写在调试窗口:
执行结果:
使用环境变量方式配置
使用环境变量配置和命令行配置的流程是差不多的,也是需要引用相关的包
Microsoft.Extensions.Configuration.EnvironmentVariables
调试窗口中配置环境变量的参数,这种做法仅限于开发过程中调试,如果是发布项目,还是需要在Windows的环境变量中配置。
代码只需要在原来的基础上稍作调整,把读取参数从命令行改为从环境变量读取。
执行结果:
在使用环境变量作为配置参数时,为了避免自定义的参数名称和原有的环境变量名称发生冲突,可以在自定义的参数名称前加上前缀,例如加上 CUS_ ,代表自定义参数。
这样就可以避免和系统本身已有的环境变量名称发生冲突。
总结:
1.从配置文件读取参数
configurationBuilder.AddJsonFile("config.json", optional: true, reloadOnChange: true)
config.json:配置文件名称(注意设置为‘如果较新则复制’)。
optional:文件是否可选。
reloadOnChange:如果文件发生更改,是否应重载配置。
2.从命令行读取参数
configurationBuilder.AddCommandLine(args)
3.从环境变量读取参数
configurationBuilder.AddEnvironmentVariables()
其他配置源
1.除了上面介绍的配置文件读取配置,命令行读取配置,环境变量读取配置外,还支持ini、xml等格式的配置源。
2.还支持在运行时、调试时加载不同的json文件。
3.还内置或者第三方支持中心化配置服务器,比如使用Apollo、Nacos等开源服务器,或者使用Azure、阿里云等的配置服务。