更新配置模型

master
bicijinlian 2 years ago
parent ce1bf54f50
commit ba684e5056

@ -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
{
/// <summary>
/// 5.2 配置模型 ConfigurationManager
/// ConfigurationManager 表示一个可动态改变的配置统一了IConfigurationt和IConfigurationBuilder,Build方法返回的就是自身。
/// 当 Source 属性体现的配置源发生变化时,基自身维护的配置状态将自动更新。
/// ASP.NET Core 框架使用的就是这个对象特别是最小API模式下。
/// </summary>
public class ConfigurationManagerTest: IDisposable
{
private readonly ITestOutputHelper testOutput;
private IDictionary<string, string?> memoryData = new Dictionary<string, string?>()
{
["AppName"] = "MemoryAppName",
["AppVersion"] = "0.0.0.1",
["EMail:ReceiveAddress"] = "memory@163.com",
["EMail:Recipient"] = "memory",
};
public ConfigurationManagerTest(ITestOutputHelper testOutputHelper)
{
testOutput = testOutputHelper;
}
/// <summary>
/// 使用配置管理器
/// 相当于 ConfigurationBuilder 和 IConfigurationIConfigurationRoot的 “合体”
/// </summary>
[Fact]
public void UseManager_Test()
{
ConfigurationManager manager = new ConfigurationManager();
manager.AddInMemoryCollection(memoryData);
var childerns = manager.GetChildren();
Assert.Equal(3, childerns.Count());
}
public void Dispose()
{
}
}
}

@ -15,7 +15,7 @@ namespace OptionStudy.Next
/// IConfigrutionProvider 被设计为 IConfigurationSource 构建,并保持在 IConfigurationBuilder 的属性中 /// IConfigrutionProvider 被设计为 IConfigurationSource 构建,并保持在 IConfigurationBuilder 的属性中
/// 所以一般不单独实例化出来使用,而是配合 IConfigurationSource 和 IConfigurationBuilder 使用 /// 所以一般不单独实例化出来使用,而是配合 IConfigurationSource 和 IConfigurationBuilder 使用
/// </summary> /// </summary>
public class IConfigurationProviderTest: IDisposable public class IConfigurationProviderTest : IDisposable
{ {
private readonly ITestOutputHelper testOutput; private readonly ITestOutputHelper testOutput;
@ -49,7 +49,7 @@ namespace OptionStudy.Next
//关联 ConfigurationSource //关联 ConfigurationSource
var source = new MemoryConfigurationSource() var source = new MemoryConfigurationSource()
{ {
InitialData = new Dictionary<string, string?>() { ["TestName"]="MyTest"} InitialData = new Dictionary<string, string?>() { ["TestName"] = "MyTest" }
}; };
var provider = new MemoryConfigurationProvider(source); var provider = new MemoryConfigurationProvider(source);
Assert.NotNull(provider); Assert.NotNull(provider);
@ -58,7 +58,7 @@ namespace OptionStudy.Next
Action run = () => Action run = () =>
{ {
provider.Set("TestName", "UpdateName"); provider.Set("TestName", "UpdateName");
if (!provider.TryGet("Demo",out string _v)) if (!provider.TryGet("Demo", out string _v))
{ {
provider.Add("Demo", "demo"); provider.Add("Demo", "demo");
} }
@ -76,28 +76,38 @@ namespace OptionStudy.Next
} }
/// <summary> /// <summary>
/// 获取 IConfigrution 手动添加配置源 /// IConfigurationProvider 由 Source 构建
/// 方法一ConfigurationSource Build()方法
/// 说明:参数为空值,框架设置的参数并没有在初始化中直接使用,可能是强调与 ConfigurationBuilder 关系吧
/// IConfigurationProvider 应该由 IConfigurationBuilder 创建,基本是写在扩展方法里,这样设计可能是强调这种编程使用方式吧
/// </summary> /// </summary>
[Fact] [Fact]
public void IConfigrutionProvider_Create_1_Test() public void IConfigrutionProvider_BuildBySource_Test()
{ {
//内存配置源 //内存配置源
MemoryConfigurationSource source = new MemoryConfigurationSource() MemoryConfigurationSource source = new MemoryConfigurationSource()
{ {
InitialData= memoryData, InitialData = memoryData,
}; };
//内存配置提供者:实际上由配置源提供,构建过程中直接使用配置源,不需要单独提出来
var provider = source.Build(null); var provider = source.Build(null);
var hasName = provider.TryGet("AppName", out _);
Assert.NotNull(provider);
Assert.True(hasName);
}
/// <summary>
/// IConfigurationProvider 由 IConfigruationBuilder 构建
/// </summary>
[Fact]
public void IConfigrutionProvider_IConfigruationBuilder_Test()
{
var builder = new ConfigurationBuilder().AddInMemoryCollection(memoryData).Build();
var provider = builder.Providers.First();
//直接使用配置源,无需显式使用 Provider var hasName = provider.TryGet("AppName", out _);
var builder = new ConfigurationBuilder().Add(source);
var configrution = builder.Build();
Assert.NotNull(configrution); Assert.NotNull(provider);
Assert.True(hasName);
} }
public void Dispose() public void Dispose()

Loading…
Cancel
Save