diff --git a/OptionStudy.Next/2配置模型/ConfigurationManagerTest.cs b/OptionStudy.Next/2配置模型/ConfigurationManagerTest.cs new file mode 100644 index 0000000..8f57366 --- /dev/null +++ b/OptionStudy.Next/2配置模型/ConfigurationManagerTest.cs @@ -0,0 +1,55 @@ +using Microsoft.Extensions.Configuration; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading.Tasks; + +namespace OptionStudy.Next +{ + /// + /// 5.2 配置模型 ConfigurationManager + /// ConfigurationManager 表示一个可动态改变的配置,统一了IConfigurationt和IConfigurationBuilder,Build方法返回的就是自身。 + /// 当 Source 属性体现的配置源发生变化时,基自身维护的配置状态将自动更新。 + /// ASP.NET Core 框架使用的就是这个对象,特别是最小API模式下。 + /// + public class ConfigurationManagerTest: IDisposable + { + private readonly ITestOutputHelper testOutput; + + private IDictionary memoryData = new Dictionary() + { + ["AppName"] = "MemoryAppName", + ["AppVersion"] = "0.0.0.1", + ["EMail:ReceiveAddress"] = "memory@163.com", + ["EMail:Recipient"] = "memory", + }; + + public ConfigurationManagerTest(ITestOutputHelper testOutputHelper) + { + testOutput = testOutputHelper; + } + + /// + /// 使用配置管理器 + /// 相当于 ConfigurationBuilder 和 IConfiguration(IConfigurationRoot)的 “合体” + /// + [Fact] + public void UseManager_Test() + { + ConfigurationManager manager = new ConfigurationManager(); + manager.AddInMemoryCollection(memoryData); + + var childerns = manager.GetChildren(); + + Assert.Equal(3, childerns.Count()); + } + + public void Dispose() + { + + } + } +} diff --git a/OptionStudy.Next/2配置模型/IConfigurationProviderTest.cs b/OptionStudy.Next/2配置模型/IConfigurationProviderTest.cs index fd2c6fa..c0268cb 100644 --- a/OptionStudy.Next/2配置模型/IConfigurationProviderTest.cs +++ b/OptionStudy.Next/2配置模型/IConfigurationProviderTest.cs @@ -15,7 +15,7 @@ namespace OptionStudy.Next /// IConfigrutionProvider 被设计为 IConfigurationSource 构建,并保持在 IConfigurationBuilder 的属性中 /// 所以一般不单独实例化出来使用,而是配合 IConfigurationSource 和 IConfigurationBuilder 使用 /// - public class IConfigurationProviderTest: IDisposable + public class IConfigurationProviderTest : IDisposable { private readonly ITestOutputHelper testOutput; @@ -49,20 +49,20 @@ namespace OptionStudy.Next //关联 ConfigurationSource var source = new MemoryConfigurationSource() { - InitialData = new Dictionary() { ["TestName"]="MyTest"} + InitialData = new Dictionary() { ["TestName"] = "MyTest" } }; var provider = new MemoryConfigurationProvider(source); Assert.NotNull(provider); //可以进行各种操作 - Action run = () => + Action run = () => { provider.Set("TestName", "UpdateName"); - if (!provider.TryGet("Demo",out string _v)) - { - provider.Add("Demo", "demo"); + if (!provider.TryGet("Demo", out string _v)) + { + provider.Add("Demo", "demo"); } - + provider.Load(); }; @@ -76,28 +76,38 @@ namespace OptionStudy.Next } /// - /// 获取 IConfigrution 手动添加配置源 - /// 方法一:ConfigurationSource Build()方法 - /// 说明:参数为空值,框架设置的参数并没有在初始化中直接使用,可能是强调与 ConfigurationBuilder 关系吧 - /// IConfigurationProvider 应该由 IConfigurationBuilder 创建,基本是写在扩展方法里,这样设计可能是强调这种编程使用方式吧 + /// IConfigurationProvider 由 Source 构建 /// [Fact] - public void IConfigrutionProvider_Create_1_Test() + public void IConfigrutionProvider_BuildBySource_Test() { //内存配置源 MemoryConfigurationSource source = new MemoryConfigurationSource() - { - InitialData= memoryData, + { + InitialData = memoryData, }; - //内存配置提供者:实际上由配置源提供,构建过程中直接使用配置源,不需要单独提出来 + var provider = source.Build(null); + var hasName = provider.TryGet("AppName", out _); + + Assert.NotNull(provider); + Assert.True(hasName); + } - //直接使用配置源,无需显式使用 Provider - var builder = new ConfigurationBuilder().Add(source); - var configrution = builder.Build(); + /// + /// IConfigurationProvider 由 IConfigruationBuilder 构建 + /// + [Fact] + public void IConfigrutionProvider_IConfigruationBuilder_Test() + { + var builder = new ConfigurationBuilder().AddInMemoryCollection(memoryData).Build(); + var provider = builder.Providers.First(); + + var hasName = provider.TryGet("AppName", out _); - Assert.NotNull(configrution); + Assert.NotNull(provider); + Assert.True(hasName); } public void Dispose()