|
|
using System.Text.Json;
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
using Microsoft.Extensions.Configuration;
|
|
|
using Microsoft.Extensions.Configuration.Memory;
|
|
|
using Microsoft.Extensions.Configuration.Json;
|
|
|
using Microsoft.Extensions.Options;
|
|
|
|
|
|
namespace OptionsPattern.Sutdy.Experience.ConsoleApp
|
|
|
{
|
|
|
/// <summary>
|
|
|
/// 6.1.3 配置源的同步
|
|
|
/// 单独一个线程,随机时间改变配置文件内容
|
|
|
/// 主线程接收的更改通知,把新配置打印到控制台窗口
|
|
|
/// </summary>
|
|
|
internal class Program
|
|
|
{
|
|
|
private static string jsonConfigFile = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"appsettings.json");
|
|
|
|
|
|
static void Main(string[] args)
|
|
|
{
|
|
|
Console.WriteLine("============ 配置选项编程体验:6.1.3 配置源的同步 ============");
|
|
|
|
|
|
//获取配置项
|
|
|
var configuration=new ConfigurationBuilder().AddJsonFile(jsonConfigFile,false,true).Build();
|
|
|
new ServiceCollection()
|
|
|
.AddOptions()
|
|
|
.Configure<AppOption>(configuration)
|
|
|
.BuildServiceProvider()
|
|
|
.GetRequiredService<IOptionsMonitor<AppOption>>()
|
|
|
.OnChange(app =>
|
|
|
{
|
|
|
var jsonText = JsonSerializer.Serialize(app);
|
|
|
Console.WriteLine($"{DateTime.Now.ToString("yyyy:MM:dd HH:mm:ss FFFFFF")} 接到变更通知,新项为:");
|
|
|
Console.WriteLine(jsonText);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
//随机改变配置文件内容
|
|
|
new Thread((jsonFile) =>
|
|
|
{
|
|
|
while (true)
|
|
|
{
|
|
|
ChangeJsonFileContent(jsonConfigFile, 5, 10);
|
|
|
}
|
|
|
})
|
|
|
.Start(jsonConfigFile);
|
|
|
|
|
|
Console.ReadLine();
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 随机秒数,随机改变Json配置文件配置项的值
|
|
|
/// </summary>
|
|
|
static void ChangeJsonFileContent(string jsonFileFullPath,int min=5,int max = 20)
|
|
|
{
|
|
|
if (string.IsNullOrWhiteSpace(jsonFileFullPath))
|
|
|
{
|
|
|
throw new ArgumentException($"参数{nameof(jsonFileFullPath)}不能为空!");
|
|
|
}
|
|
|
|
|
|
if (!File.Exists(jsonFileFullPath))
|
|
|
{
|
|
|
throw new FileNotFoundException($"参数{nameof(jsonFileFullPath)}指定的json配置文件不存在!");
|
|
|
}
|
|
|
|
|
|
//随机时间(秒数)
|
|
|
Random random = new Random();
|
|
|
var secondNum = random.Next(min, max);
|
|
|
Thread.Sleep(1000 * secondNum);
|
|
|
|
|
|
//读取Json配置文件内容
|
|
|
var appOption = new ConfigurationBuilder()
|
|
|
.AddJsonFile(jsonFileFullPath, false, false)
|
|
|
.Build()
|
|
|
.Get<AppOption>();
|
|
|
//改变配置项
|
|
|
appOption.AppName = Guid.NewGuid().ToString()+"_AppName";
|
|
|
appOption.AppVersion = new Version(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);
|
|
|
appOption.EMail = new ReceiveMailOption()
|
|
|
{
|
|
|
ReceiveAddress = appOption.AppName + "@163.com",
|
|
|
Recipient = secondNum + "_Recipient",
|
|
|
};
|
|
|
|
|
|
//写回文件
|
|
|
var jsonText = JsonSerializer.Serialize(appOption);
|
|
|
|
|
|
File.WriteAllText(jsonFileFullPath,jsonText);
|
|
|
|
|
|
Console.WriteLine($"{DateTime.Now.ToString("yyyy:MM:dd HH:mm:ss FFFFFF")} 改变配置文件内容:");
|
|
|
Console.WriteLine(jsonText);
|
|
|
}
|
|
|
}
|
|
|
} |