文章目录
一、Key/Valve形式
代码如下(示例):
static void Main(string[] args)
{
IConfigurationBuilder builder = new ConfigurationBuilder();
builder.AddInMemoryCollection(new Dictionary<string, string> {
{"Key1","Value1" },
{ "Section1:Key2","Value2"},
{"Section2:Section3:Key3","Value3" }
});
IConfigurationRoot configurationRoot = builder.Build();
string value1 = configurationRoot["Key1"];
IConfigurationSection configurationSection = configurationRoot.GetSection("Section1");
string value2 = configurationSection["Key2"];
IConfigurationSection configurationSection1 = configurationRoot.GetSection("Section2");
IConfigurationSection configurationSection2 = configurationSection1.GetSection("Section3");
string value3 = configurationSection2["Key3"];
Console.Read();
}
二、CommandLine形式
1.调试Tab中配置
配置完后,会自动生成一个launchSettings.json文件,若以后修改可以直接修改这个文件。
代码如下(示例):
static void Main(string[] args)
{
var builder = new ConfigurationBuilder();
//builder.AddCommandLine(args);
#region 命令替换
var mapping = new Dictionary<string, string>{ { "-k1","CmdLineKey"} };
builder.AddCommandLine(args, mapping);
#endregion
var cftRoot = builder.Build();
Console.WriteLine($"CmdLineKey:{cftRoot["CmdLineKey"]}");
Console.WriteLine($"CmdLineKey2:{cftRoot["CmdLineKey2"]}");
Console.WriteLine($"CmdLineKey3:{cftRoot["CmdLineKey3"]}");
Console.WriteLine($"CmdLineKey4:{cftRoot["CmdLineKey4"]}");
Console.ReadKey();
}
2.命令格式支持
- 无前缀的 key=value 模式
- 双中横线模式 --key=value 或 --key value
- 正斜杠模式 /key=value 或 /key value
- 替换命令支持单划线 (-) 或双划线 (–)
三、环境变量
1.调试Tab中配置
配置完后,会自动生成一个launchSettings.json文件,若以后修改可以直接修改这个文件。
2.测试代码
代码如下(示例):
static void Main(string[] args)
{
var builder = new ConfigurationBuilder();
builder.AddEnvironmentVariables();
var root = builder.Build();
Console.WriteLine($"Key1 = {root["Key1"]}");
var section = root.GetSection("Section");
Console.WriteLine($"Section's Key2 ={section["Key2"]}");
var setction2 = root.GetSection("Section1:Section2");//--在代码里解析:
Console.WriteLine($"double section Key3={setction2["Key3"]}");
//TestPrefixFilter();
Console.Read();
}
/// <summary>
/// 前缀过滤
/// </summary>
private static void TestPrefixFilter()
{
var builder = new ConfigurationBuilder();
builder.AddEnvironmentVariables("Fisea_");
var root = builder.Build();
Console.WriteLine($"Key1 = {root["Key1"]}");
var section = root.GetSection("Section");
Console.WriteLine($"Section's Key2 ={section["Key2"]}");
}
四、Json配置文件
1.新建一个Json文件
代码如下(示例):
{
"Address": "test address value3112",
"sourceMap": 3,
"ClientService": {
"Id": 200,
"Name": "Fisea",
"Sex": true
}
}
2.测试代码
代码如下(示例):
static void Main(string[] args)
{
var builder = new ConfigurationBuilder();
builder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
var root = builder.Build();
Console.WriteLine($"Address:{root["Address"]},sourceMap:{root["sourceMap"]}");
Console.ReadKey();
Console.WriteLine($"Address:{root["Address"]},sourceMap:{root["sourceMap"]}");
Console.ReadKey();
var config = new ConfigValve()
{
Name="FiseaW",
Id=101
};
//优先使用配置节点ClientService的值,若没有配置,则使用config对象的值
root.GetSection("ClientService").Bind(config, (binderOpt) => { binderOpt.BindNonPublicProperties = true; });
Console.WriteLine($"Id={config.Id},Sex={config.Sex},Name={config.Name}");
//IChangeToken changeToken = root.GetReloadToken();
ChangeToken.OnChange(() => root.GetReloadToken(), () => { //若配置文件发生变更,则会执行到这里来
Console.WriteLine($"OnChange,Address:{root["Address"]},sourceMap:{root["sourceMap"]}");
});
Console.WriteLine("starting");
Console.ReadKey();
Console.WriteLine($"Address:{root["Address"]},sourceMap:{root["sourceMap"]}");
Console.ReadKey();
Console.Read();
}
五、自定义配置
1.实现 IConfigurationSource
代码如下(示例):
class CustomConfigurationSource : IConfigurationSource
{
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return new CustomConfigurationProvider();
}
}
2.实现 IConfigurationProvider
代码如下(示例):
class CustomConfigurationProvider : ConfigurationProvider
{
Timer timer;
public CustomConfigurationProvider():base()
{
timer = new Timer();
timer.Elapsed += Timer_Elapsed;
timer.Interval = 3000;
timer.Start();
}
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
Load(true);
}
public override void Load()
{
Load(false);
}
void Load(bool reload)
{
this.Data["LastAccessTime"] = DateTime.Now.ToString();
if (reload)
{
base.OnReload();
}
}
}
3.实现 AddXXX 扩展方法
代码如下(示例):
public static class CustomConfigurationBuilderExtensions
{
public static IConfigurationBuilder AddCustomConfiguration(this IConfigurationBuilder builder)
{
builder.Add(new CustomConfigurationSource());
return builder;
}
}
之所以单独实现这个方法,是为了封装的更好,不然上端需要知道CustomConfigurationSource这个类的细节。
4.测试
代码如下(示例):
static void Main(string[] args)
{
var builder = new ConfigurationBuilder();
builder.AddCustomConfiguration();
var root = builder.Build();
ChangeToken.OnChange(() => root.GetReloadToken(), () => {
Console.WriteLine($"LastAccessTime:{root["LastAccessTime"]}");
});
Console.WriteLine($"Starting");
Console.Read();
}