diff --git a/OptionsPattern.Sutdy.Experience.ConsoleApp/Options/AppOption.cs b/OptionsPattern.Sutdy.Experience.ConsoleApp/Options/AppOption.cs new file mode 100644 index 0000000..29a5802 --- /dev/null +++ b/OptionsPattern.Sutdy.Experience.ConsoleApp/Options/AppOption.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OptionsPattern.Sutdy.Experience.ConsoleApp +{ + public class AppOption + { + /// + /// 软件名 + /// + public string AppName { get; set; } = "IniAppName"; + + /// + /// 软件版本 + /// + public Version AppVersion { get; set; } = new Version( "0.0.0.1"); + + /// + /// 接收邮箱配置对象 + /// + public ReceiveMailOption? EMail { get; set; } + } +} diff --git a/OptionsPattern.Sutdy.Experience.ConsoleApp/Options/ReceiveMailOption.cs b/OptionsPattern.Sutdy.Experience.ConsoleApp/Options/ReceiveMailOption.cs new file mode 100644 index 0000000..702e0f6 --- /dev/null +++ b/OptionsPattern.Sutdy.Experience.ConsoleApp/Options/ReceiveMailOption.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OptionsPattern.Sutdy.Experience.ConsoleApp +{ + /// + /// 接收邮件配置 + /// + public class ReceiveMailOption + { + /// + /// 接收邮箱地址 + /// + public string? ReceiveAddress { get; set; } + + /// + /// 接收人 + /// + public string? Recipient{ get; set; } + } +} diff --git a/OptionsPattern.Sutdy.Experience.ConsoleApp/OptionsPattern.Sutdy.Experience.ConsoleApp.csproj b/OptionsPattern.Sutdy.Experience.ConsoleApp/OptionsPattern.Sutdy.Experience.ConsoleApp.csproj index 1fefe2c..2a5a3fe 100644 --- a/OptionsPattern.Sutdy.Experience.ConsoleApp/OptionsPattern.Sutdy.Experience.ConsoleApp.csproj +++ b/OptionsPattern.Sutdy.Experience.ConsoleApp/OptionsPattern.Sutdy.Experience.ConsoleApp.csproj @@ -9,8 +9,17 @@ + + + + + + + + PreserveNewest + diff --git a/OptionsPattern.Sutdy.Experience.ConsoleApp/Program.cs b/OptionsPattern.Sutdy.Experience.ConsoleApp/Program.cs index a4741bc..d54ce5c 100644 --- a/OptionsPattern.Sutdy.Experience.ConsoleApp/Program.cs +++ b/OptionsPattern.Sutdy.Experience.ConsoleApp/Program.cs @@ -1,10 +1,95 @@ -namespace OptionsPattern.Sutdy.Experience.ConsoleApp +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 { + /// + /// 6.1.3 配置源的同步 + /// 单独一个线程,随机时间改变配置文件内容 + /// 主线程接收的更改通知,把新配置打印到控制台窗口 + /// 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(configuration) + .BuildServiceProvider() + .GetRequiredService>() + .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(); + } + + /// + /// 随机秒数,随机改变Json配置文件配置项的值 + /// + 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.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); } } } \ No newline at end of file diff --git a/OptionsPattern.Sutdy.Experience.ConsoleApp/appsettings.json b/OptionsPattern.Sutdy.Experience.ConsoleApp/appsettings.json new file mode 100644 index 0000000..3b859c1 --- /dev/null +++ b/OptionsPattern.Sutdy.Experience.ConsoleApp/appsettings.json @@ -0,0 +1,8 @@ +{ + "AppName": "JsonAppNmae", + "AppVersion": "0.0.0.1", + "EMail": { + "ReceiveAddress": "json@163.com", + "Recipient": "json" + } +}