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"
+ }
+}