diff --git a/OptionsPattern.Sutdy.Experience.ConsoleApp/OptionsPattern.Sutdy.Experience.ConsoleApp.csproj b/OptionsPattern.Sutdy.Experience.ConsoleApp/OptionsPattern.Sutdy.Experience.ConsoleApp.csproj
new file mode 100644
index 0000000..1fefe2c
--- /dev/null
+++ b/OptionsPattern.Sutdy.Experience.ConsoleApp/OptionsPattern.Sutdy.Experience.ConsoleApp.csproj
@@ -0,0 +1,16 @@
+
+
+
+ Exe
+ net6.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
diff --git a/OptionsPattern.Sutdy.Experience.ConsoleApp/Program.cs b/OptionsPattern.Sutdy.Experience.ConsoleApp/Program.cs
new file mode 100644
index 0000000..e906582
--- /dev/null
+++ b/OptionsPattern.Sutdy.Experience.ConsoleApp/Program.cs
@@ -0,0 +1,10 @@
+namespace OptionsPattern.Sutdy.Experience.ConsoleApp
+{
+ internal class Program
+ {
+ static void Main(string[] args)
+ {
+ Console.WriteLine("============ 选项模式:6.1.3 配置源的同步 ============");
+ }
+ }
+}
\ No newline at end of file
diff --git a/OptionsPattern.Sutdy.Experience/Configs/appsettings.custom.json b/OptionsPattern.Sutdy.Experience/Configs/appsettings.custom.json
new file mode 100644
index 0000000..1cb9db7
--- /dev/null
+++ b/OptionsPattern.Sutdy.Experience/Configs/appsettings.custom.json
@@ -0,0 +1,8 @@
+{
+ "AppName": "customAppNmae",
+ "AppVersion": "0.0.0.1",
+ "EMail": {
+ "ReceiveAddress": "custom@163.com",
+ "Recipient": "custom"
+ }
+}
diff --git a/OptionsPattern.Sutdy.Experience/Configs/appsettings.development.json b/OptionsPattern.Sutdy.Experience/Configs/appsettings.development.json
new file mode 100644
index 0000000..fd26658
--- /dev/null
+++ b/OptionsPattern.Sutdy.Experience/Configs/appsettings.development.json
@@ -0,0 +1,8 @@
+{
+ "AppName": "developmentAppNmae",
+ "AppVersion": "0.0.0.1",
+ "EMail": {
+ "ReceiveAddress": "development@163.com",
+ "Recipient": "development"
+ }
+}
diff --git a/OptionsPattern.Sutdy.Experience/Configs/appsettings.ini b/OptionsPattern.Sutdy.Experience/Configs/appsettings.ini
new file mode 100644
index 0000000..71ed5d4
--- /dev/null
+++ b/OptionsPattern.Sutdy.Experience/Configs/appsettings.ini
@@ -0,0 +1,8 @@
+# App设置
+AppName=IniAppName
+AppVersion=0.0.0.1
+
+[Email]
+#邮箱设置
+ReceiveAddress=ini@163.com
+Recipient=ini
\ No newline at end of file
diff --git a/OptionsPattern.Sutdy.Experience/Configs/appsettings.json b/OptionsPattern.Sutdy.Experience/Configs/appsettings.json
new file mode 100644
index 0000000..3b859c1
--- /dev/null
+++ b/OptionsPattern.Sutdy.Experience/Configs/appsettings.json
@@ -0,0 +1,8 @@
+{
+ "AppName": "JsonAppNmae",
+ "AppVersion": "0.0.0.1",
+ "EMail": {
+ "ReceiveAddress": "json@163.com",
+ "Recipient": "json"
+ }
+}
diff --git a/OptionsPattern.Sutdy.Experience/Configs/appsettings.product.json b/OptionsPattern.Sutdy.Experience/Configs/appsettings.product.json
new file mode 100644
index 0000000..48639b5
--- /dev/null
+++ b/OptionsPattern.Sutdy.Experience/Configs/appsettings.product.json
@@ -0,0 +1,8 @@
+{
+ "AppName": "productAppNmae",
+ "AppVersion": "0.0.0.1",
+ "EMail": {
+ "ReceiveAddress": "product@163.com",
+ "Recipient": "product"
+ }
+}
diff --git a/OptionsPattern.Sutdy.Experience/Configs/appsettings.xml b/OptionsPattern.Sutdy.Experience/Configs/appsettings.xml
new file mode 100644
index 0000000..f0d0846
--- /dev/null
+++ b/OptionsPattern.Sutdy.Experience/Configs/appsettings.xml
@@ -0,0 +1,9 @@
+
+
+ XmlAppName
+ 1.2.3.4
+
+ xml@163.com
+ xml
+
+
diff --git a/OptionsPattern.Sutdy.Experience/Configs/appsettings.yml b/OptionsPattern.Sutdy.Experience/Configs/appsettings.yml
new file mode 100644
index 0000000..0aeac52
--- /dev/null
+++ b/OptionsPattern.Sutdy.Experience/Configs/appsettings.yml
@@ -0,0 +1,8 @@
+#yaml配置格式
+AppName: YamlAppName
+AppVersion: 0.0.0.1
+
+#邮件配置
+EMail:
+ ReceiveAddress: yaml@163.com
+ Recipient: yaml
\ No newline at end of file
diff --git a/OptionsPattern.Sutdy.Experience/Options/AppOption.cs b/OptionsPattern.Sutdy.Experience/Options/AppOption.cs
new file mode 100644
index 0000000..acb0cde
--- /dev/null
+++ b/OptionsPattern.Sutdy.Experience/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
+{
+ 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/Options/ReceiveMailOption.cs b/OptionsPattern.Sutdy.Experience/Options/ReceiveMailOption.cs
new file mode 100644
index 0000000..46145b1
--- /dev/null
+++ b/OptionsPattern.Sutdy.Experience/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
+{
+ ///
+ /// 接收邮件配置
+ ///
+ public class ReceiveMailOption
+ {
+ ///
+ /// 接收邮箱地址
+ ///
+ public string? ReceiveAddress { get; set; }
+
+ ///
+ /// 接收人
+ ///
+ public string? Recipient{ get; set; }
+ }
+}
diff --git a/OptionsPattern.Sutdy.Experience/OptionsPattern.Sutdy.Experience.csproj b/OptionsPattern.Sutdy.Experience/OptionsPattern.Sutdy.Experience.csproj
new file mode 100644
index 0000000..5ee861d
--- /dev/null
+++ b/OptionsPattern.Sutdy.Experience/OptionsPattern.Sutdy.Experience.csproj
@@ -0,0 +1,64 @@
+
+
+
+ net6.0
+ enable
+ enable
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+
+
diff --git a/OptionsPattern.Sutdy.Experience/Startup.cs b/OptionsPattern.Sutdy.Experience/Startup.cs
new file mode 100644
index 0000000..04de861
--- /dev/null
+++ b/OptionsPattern.Sutdy.Experience/Startup.cs
@@ -0,0 +1,80 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.DependencyInjection;
+
+using Xunit;
+using Xunit.Sdk;
+using Xunit.Abstractions;
+using Xunit.Extensions;
+using Xunit.DependencyInjection;
+using Xunit.DependencyInjection.Logging;
+
+namespace OptionsPattern.Sutdy.Experience
+{
+ public class Startup
+ {
+ //生成主机方法
+ //public IHostBuilder CreateHostBuilder()
+ //{
+
+ //}
+
+ ///
+ /// 配置主机方法
+ /// 内部可以配置 IConfiguration
+ ///
+ public void ConfigureHost(IHostBuilder hostBuilder)
+ {
+ //设置主机配置
+ hostBuilder.ConfigureHostConfiguration(builder =>
+ {
+
+ });
+
+ //设置应用配置
+ hostBuilder.ConfigureAppConfiguration((context, builder) =>
+ {
+
+ });
+
+ //集成 Opentelemetry
+ //var tracerProvider = Sdk.CreateTracerProviderBuilder()
+ // .AddSource("Xunit.DependencyInjection")
+ // .AddConsoleExporter();
+
+ }
+
+ ///
+ /// 配置服务方法
+ /// (不支持重载)
+ ///
+ //public void ConfigureServices(IServiceCollection services)
+ //{
+
+ //}
+
+ ///
+ /// 配置服务方法
+ /// 注入或用途 IConfiguration IHostEnvironment 请使用 context.xx;
+ ///
+ public void ConfigureServices(IServiceCollection services, HostBuilderContext context)
+ {
+
+
+ }
+
+ ///
+ /// 将 Microsoft.Extensions.Logging 写入 ITestOutputHelper
+ ///
+ public void Configure(ILoggerFactory loggerFactory, ITestOutputHelperAccessor accessor)
+ {
+ loggerFactory.AddProvider(new XunitTestOutputLoggerProvider(accessor));
+ }
+ }
+}
diff --git a/OptionsPattern.Sutdy.Experience/UseXunitTest.cs b/OptionsPattern.Sutdy.Experience/UseXunitTest.cs
new file mode 100644
index 0000000..dc21687
--- /dev/null
+++ b/OptionsPattern.Sutdy.Experience/UseXunitTest.cs
@@ -0,0 +1,74 @@
+namespace OptionsPattern.Sutdy.Experience
+{
+ public class UseXunitTest:IDisposable
+ {
+ private readonly ITestOutputHelper? _output;
+ public UseXunitTest(ITestOutputHelperAccessor outputHelperAccessor)
+ {
+ if (outputHelperAccessor == null)
+ {
+ throw new ArgumentNullException(nameof(outputHelperAccessor));
+ }
+ _output = outputHelperAccessor.Output;
+ }
+
+
+ ///
+ /// xUnit Բ
+ ///
+ [Fact]
+ public void UsabilityTest()
+ {
+ Assert.True(true, "ʹxUnitԿܣ");
+ _output?.WriteLine("ʹ xUnit Ϣԣ");
+ }
+
+ ///
+ /// Բ쳣
+ /// ʹãxUnit ͨ
+ ///
+ [Fact]
+ public void DoesNotThrow_Test()
+ {
+ //ִд
+ Action codeSnippet = () =>
+ {
+ //ҵ
+
+ //ģ쳣
+ //throw new Exception("׳쳣");
+ };
+
+ var exception = Record.Exception(codeSnippet);
+ Assert.Null(exception);
+
+ _output?.WriteLine("ʹ xUnit ͨԲ쳣");
+ }
+
+ ///
+ /// Բ쳣
+ /// ʹãFluentAssertions ⷽʽԲ쳣
+ ///
+ [Fact]
+ public void DoesNotThrow_UseFluentAssertions_Test()
+ {
+ //ִд
+ Action codeSnippet= () =>
+ {
+ //ҵ
+
+ //ģ쳣
+ //throw new Exception("׳쳣");
+ };
+
+ //ԣ쳣
+ codeSnippet.Should().NotThrow();
+
+ _output?.WriteLine("ʹ FluentAssertions ⷽʽԲ쳣");
+ }
+
+ public void Dispose()
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/OptionsPattern.Sutdy.Experience/Usings.cs b/OptionsPattern.Sutdy.Experience/Usings.cs
new file mode 100644
index 0000000..ce36fb1
--- /dev/null
+++ b/OptionsPattern.Sutdy.Experience/Usings.cs
@@ -0,0 +1,35 @@
+global using System;
+global using System.Linq;
+global using System.Text;
+global using System.Threading.Tasks;
+global using System.Collections;
+global using System.Collections.Generic;
+global using System.Collections.Concurrent;
+global using System.Collections.Specialized;
+
+global using Microsoft.Extensions.Configuration;
+global using Microsoft.Extensions.Configuration.Memory;
+global using Microsoft.Extensions.Configuration.EnvironmentVariables;
+global using Microsoft.Extensions.Configuration.CommandLine;
+global using Microsoft.Extensions.Configuration.UserSecrets;
+global using Microsoft.Extensions.Configuration.Json;
+global using Microsoft.Extensions.Configuration.Ini;
+global using Microsoft.Extensions.Configuration.Xml;
+
+
+global using Xunit;
+global using Xunit.Abstractions;
+global using Xunit.DependencyInjection;
+
+global using Moq;
+global using Moq.Internals;
+global using Moq.Language;
+global using Moq.Protected;
+
+global using AutoFixture;
+global using AutoFixture.DataAnnotations;
+global using AutoFixture.AutoMoq;
+global using AutoFixture.Xunit2;
+
+global using FluentAssertions;
+global using FluentAssertions.Extensions;
\ No newline at end of file
diff --git a/OptionsPattern.Sutdy.Uncover/Configs/appsettings.custom.json b/OptionsPattern.Sutdy.Uncover/Configs/appsettings.custom.json
new file mode 100644
index 0000000..1cb9db7
--- /dev/null
+++ b/OptionsPattern.Sutdy.Uncover/Configs/appsettings.custom.json
@@ -0,0 +1,8 @@
+{
+ "AppName": "customAppNmae",
+ "AppVersion": "0.0.0.1",
+ "EMail": {
+ "ReceiveAddress": "custom@163.com",
+ "Recipient": "custom"
+ }
+}
diff --git a/OptionsPattern.Sutdy.Uncover/Configs/appsettings.development.json b/OptionsPattern.Sutdy.Uncover/Configs/appsettings.development.json
new file mode 100644
index 0000000..fd26658
--- /dev/null
+++ b/OptionsPattern.Sutdy.Uncover/Configs/appsettings.development.json
@@ -0,0 +1,8 @@
+{
+ "AppName": "developmentAppNmae",
+ "AppVersion": "0.0.0.1",
+ "EMail": {
+ "ReceiveAddress": "development@163.com",
+ "Recipient": "development"
+ }
+}
diff --git a/OptionsPattern.Sutdy.Uncover/Configs/appsettings.ini b/OptionsPattern.Sutdy.Uncover/Configs/appsettings.ini
new file mode 100644
index 0000000..71ed5d4
--- /dev/null
+++ b/OptionsPattern.Sutdy.Uncover/Configs/appsettings.ini
@@ -0,0 +1,8 @@
+# App设置
+AppName=IniAppName
+AppVersion=0.0.0.1
+
+[Email]
+#邮箱设置
+ReceiveAddress=ini@163.com
+Recipient=ini
\ No newline at end of file
diff --git a/OptionsPattern.Sutdy.Uncover/Configs/appsettings.json b/OptionsPattern.Sutdy.Uncover/Configs/appsettings.json
new file mode 100644
index 0000000..3b859c1
--- /dev/null
+++ b/OptionsPattern.Sutdy.Uncover/Configs/appsettings.json
@@ -0,0 +1,8 @@
+{
+ "AppName": "JsonAppNmae",
+ "AppVersion": "0.0.0.1",
+ "EMail": {
+ "ReceiveAddress": "json@163.com",
+ "Recipient": "json"
+ }
+}
diff --git a/OptionsPattern.Sutdy.Uncover/Configs/appsettings.product.json b/OptionsPattern.Sutdy.Uncover/Configs/appsettings.product.json
new file mode 100644
index 0000000..48639b5
--- /dev/null
+++ b/OptionsPattern.Sutdy.Uncover/Configs/appsettings.product.json
@@ -0,0 +1,8 @@
+{
+ "AppName": "productAppNmae",
+ "AppVersion": "0.0.0.1",
+ "EMail": {
+ "ReceiveAddress": "product@163.com",
+ "Recipient": "product"
+ }
+}
diff --git a/OptionsPattern.Sutdy.Uncover/Configs/appsettings.xml b/OptionsPattern.Sutdy.Uncover/Configs/appsettings.xml
new file mode 100644
index 0000000..f0d0846
--- /dev/null
+++ b/OptionsPattern.Sutdy.Uncover/Configs/appsettings.xml
@@ -0,0 +1,9 @@
+
+
+ XmlAppName
+ 1.2.3.4
+
+ xml@163.com
+ xml
+
+
diff --git a/OptionsPattern.Sutdy.Uncover/Configs/appsettings.yml b/OptionsPattern.Sutdy.Uncover/Configs/appsettings.yml
new file mode 100644
index 0000000..0aeac52
--- /dev/null
+++ b/OptionsPattern.Sutdy.Uncover/Configs/appsettings.yml
@@ -0,0 +1,8 @@
+#yaml配置格式
+AppName: YamlAppName
+AppVersion: 0.0.0.1
+
+#邮件配置
+EMail:
+ ReceiveAddress: yaml@163.com
+ Recipient: yaml
\ No newline at end of file
diff --git a/OptionsPattern.Sutdy.Uncover/Options/AppOption.cs b/OptionsPattern.Sutdy.Uncover/Options/AppOption.cs
new file mode 100644
index 0000000..08fc5d2
--- /dev/null
+++ b/OptionsPattern.Sutdy.Uncover/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.Uncover
+{
+ 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.Uncover/Options/ReceiveMailOption.cs b/OptionsPattern.Sutdy.Uncover/Options/ReceiveMailOption.cs
new file mode 100644
index 0000000..90e512b
--- /dev/null
+++ b/OptionsPattern.Sutdy.Uncover/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.Uncover
+{
+ ///
+ /// 接收邮件配置
+ ///
+ public class ReceiveMailOption
+ {
+ ///
+ /// 接收邮箱地址
+ ///
+ public string? ReceiveAddress { get; set; }
+
+ ///
+ /// 接收人
+ ///
+ public string? Recipient{ get; set; }
+ }
+}
diff --git a/OptionsPattern.Sutdy.Uncover/OptionsPattern.Sutdy.Uncover.csproj b/OptionsPattern.Sutdy.Uncover/OptionsPattern.Sutdy.Uncover.csproj
new file mode 100644
index 0000000..536ed7f
--- /dev/null
+++ b/OptionsPattern.Sutdy.Uncover/OptionsPattern.Sutdy.Uncover.csproj
@@ -0,0 +1,64 @@
+
+
+
+ net6.0
+ enable
+ enable
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+
+
diff --git a/OptionsPattern.Sutdy.Uncover/Startup.cs b/OptionsPattern.Sutdy.Uncover/Startup.cs
new file mode 100644
index 0000000..f2ed763
--- /dev/null
+++ b/OptionsPattern.Sutdy.Uncover/Startup.cs
@@ -0,0 +1,80 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.DependencyInjection;
+
+using Xunit;
+using Xunit.Sdk;
+using Xunit.Abstractions;
+using Xunit.Extensions;
+using Xunit.DependencyInjection;
+using Xunit.DependencyInjection.Logging;
+
+namespace OptionsPattern.Sutdy.Uncover
+{
+ public class Startup
+ {
+ //生成主机方法
+ //public IHostBuilder CreateHostBuilder()
+ //{
+
+ //}
+
+ ///
+ /// 配置主机方法
+ /// 内部可以配置 IConfiguration
+ ///
+ public void ConfigureHost(IHostBuilder hostBuilder)
+ {
+ //设置主机配置
+ hostBuilder.ConfigureHostConfiguration(builder =>
+ {
+
+ });
+
+ //设置应用配置
+ hostBuilder.ConfigureAppConfiguration((context, builder) =>
+ {
+
+ });
+
+ //集成 Opentelemetry
+ //var tracerProvider = Sdk.CreateTracerProviderBuilder()
+ // .AddSource("Xunit.DependencyInjection")
+ // .AddConsoleExporter();
+
+ }
+
+ ///
+ /// 配置服务方法
+ /// (不支持重载)
+ ///
+ //public void ConfigureServices(IServiceCollection services)
+ //{
+
+ //}
+
+ ///
+ /// 配置服务方法
+ /// 注入或用途 IConfiguration IHostEnvironment 请使用 context.xx;
+ ///
+ public void ConfigureServices(IServiceCollection services, HostBuilderContext context)
+ {
+
+
+ }
+
+ ///
+ /// 将 Microsoft.Extensions.Logging 写入 ITestOutputHelper
+ ///
+ public void Configure(ILoggerFactory loggerFactory, ITestOutputHelperAccessor accessor)
+ {
+ loggerFactory.AddProvider(new XunitTestOutputLoggerProvider(accessor));
+ }
+ }
+}
diff --git a/OptionsPattern.Sutdy.Uncover/UseXunitTest.cs b/OptionsPattern.Sutdy.Uncover/UseXunitTest.cs
new file mode 100644
index 0000000..5844485
--- /dev/null
+++ b/OptionsPattern.Sutdy.Uncover/UseXunitTest.cs
@@ -0,0 +1,74 @@
+namespace OptionsPattern.Sutdy.Uncover
+{
+ public class UseXunitTest:IDisposable
+ {
+ private readonly ITestOutputHelper? _output;
+ public UseXunitTest(ITestOutputHelperAccessor outputHelperAccessor)
+ {
+ if (outputHelperAccessor == null)
+ {
+ throw new ArgumentNullException(nameof(outputHelperAccessor));
+ }
+ _output = outputHelperAccessor.Output;
+ }
+
+
+ ///
+ /// xUnit Բ
+ ///
+ [Fact]
+ public void UsabilityTest()
+ {
+ Assert.True(true, "ʹxUnitԿܣ");
+ _output?.WriteLine("ʹ xUnit Ϣԣ");
+ }
+
+ ///
+ /// Բ쳣
+ /// ʹãxUnit ͨ
+ ///
+ [Fact]
+ public void DoesNotThrow_Test()
+ {
+ //ִд
+ Action codeSnippet = () =>
+ {
+ //ҵ
+
+ //ģ쳣
+ //throw new Exception("׳쳣");
+ };
+
+ var exception = Record.Exception(codeSnippet);
+ Assert.Null(exception);
+
+ _output?.WriteLine("ʹ xUnit ͨԲ쳣");
+ }
+
+ ///
+ /// Բ쳣
+ /// ʹãFluentAssertions ⷽʽԲ쳣
+ ///
+ [Fact]
+ public void DoesNotThrow_UseFluentAssertions_Test()
+ {
+ //ִд
+ Action codeSnippet= () =>
+ {
+ //ҵ
+
+ //ģ쳣
+ //throw new Exception("׳쳣");
+ };
+
+ //ԣ쳣
+ codeSnippet.Should().NotThrow();
+
+ _output?.WriteLine("ʹ FluentAssertions ⷽʽԲ쳣");
+ }
+
+ public void Dispose()
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/OptionsPattern.Sutdy.Uncover/Usings.cs b/OptionsPattern.Sutdy.Uncover/Usings.cs
new file mode 100644
index 0000000..ce36fb1
--- /dev/null
+++ b/OptionsPattern.Sutdy.Uncover/Usings.cs
@@ -0,0 +1,35 @@
+global using System;
+global using System.Linq;
+global using System.Text;
+global using System.Threading.Tasks;
+global using System.Collections;
+global using System.Collections.Generic;
+global using System.Collections.Concurrent;
+global using System.Collections.Specialized;
+
+global using Microsoft.Extensions.Configuration;
+global using Microsoft.Extensions.Configuration.Memory;
+global using Microsoft.Extensions.Configuration.EnvironmentVariables;
+global using Microsoft.Extensions.Configuration.CommandLine;
+global using Microsoft.Extensions.Configuration.UserSecrets;
+global using Microsoft.Extensions.Configuration.Json;
+global using Microsoft.Extensions.Configuration.Ini;
+global using Microsoft.Extensions.Configuration.Xml;
+
+
+global using Xunit;
+global using Xunit.Abstractions;
+global using Xunit.DependencyInjection;
+
+global using Moq;
+global using Moq.Internals;
+global using Moq.Language;
+global using Moq.Protected;
+
+global using AutoFixture;
+global using AutoFixture.DataAnnotations;
+global using AutoFixture.AutoMoq;
+global using AutoFixture.Xunit2;
+
+global using FluentAssertions;
+global using FluentAssertions.Extensions;
\ No newline at end of file
diff --git a/框架揭秘.sln b/框架揭秘.sln
index 4923271..7cf3d64 100644
--- a/框架揭秘.sln
+++ b/框架揭秘.sln
@@ -37,6 +37,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OptionStudy.UnitApp", "Opti
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OptionStudy.Next", "OptionStudy.Next\OptionStudy.Next.csproj", "{559F6F82-A440-4D85-9F04-01CE26B1A6E6}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OptionsPattern.Sutdy.Experience", "OptionsPattern.Sutdy.Experience\OptionsPattern.Sutdy.Experience.csproj", "{9C73DFBD-E1BC-4B27-84AA-35848088D888}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OptionsPattern.Sutdy.Experience.ConsoleApp", "OptionsPattern.Sutdy.Experience.ConsoleApp\OptionsPattern.Sutdy.Experience.ConsoleApp.csproj", "{703D8C74-2B39-470B-9108-A36FF8263FAE}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OptionsPattern.Sutdy.Uncover", "OptionsPattern.Sutdy.Uncover\OptionsPattern.Sutdy.Uncover.csproj", "{D5744BA1-4D24-4D4D-A479-2293DEB7A8CF}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -51,6 +57,18 @@ Global
{559F6F82-A440-4D85-9F04-01CE26B1A6E6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{559F6F82-A440-4D85-9F04-01CE26B1A6E6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{559F6F82-A440-4D85-9F04-01CE26B1A6E6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9C73DFBD-E1BC-4B27-84AA-35848088D888}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9C73DFBD-E1BC-4B27-84AA-35848088D888}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9C73DFBD-E1BC-4B27-84AA-35848088D888}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9C73DFBD-E1BC-4B27-84AA-35848088D888}.Release|Any CPU.Build.0 = Release|Any CPU
+ {703D8C74-2B39-470B-9108-A36FF8263FAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {703D8C74-2B39-470B-9108-A36FF8263FAE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {703D8C74-2B39-470B-9108-A36FF8263FAE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {703D8C74-2B39-470B-9108-A36FF8263FAE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D5744BA1-4D24-4D4D-A479-2293DEB7A8CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D5744BA1-4D24-4D4D-A479-2293DEB7A8CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D5744BA1-4D24-4D4D-A479-2293DEB7A8CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D5744BA1-4D24-4D4D-A479-2293DEB7A8CF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -60,6 +78,9 @@ Global
{4892AF59-813D-4957-9ADC-72871AC58C68} = {97685B5C-8532-48B0-A813-3CC629F31FD3}
{E3F8F3F8-F4A9-42EA-8AA5-862B0754A1B3} = {6F45CE67-FAA8-4FF8-87C9-E8752B0734BF}
{559F6F82-A440-4D85-9F04-01CE26B1A6E6} = {6F45CE67-FAA8-4FF8-87C9-E8752B0734BF}
+ {9C73DFBD-E1BC-4B27-84AA-35848088D888} = {4B3A7989-5D9D-48E0-A2F7-AAD44039D89F}
+ {703D8C74-2B39-470B-9108-A36FF8263FAE} = {4B3A7989-5D9D-48E0-A2F7-AAD44039D89F}
+ {D5744BA1-4D24-4D4D-A479-2293DEB7A8CF} = {4B3A7989-5D9D-48E0-A2F7-AAD44039D89F}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {CB07E3E3-03BD-416A-A489-E36B56D71EDC}