接着上一章继续聊这个项目
本章主要会介绍到一下几点
- 配置文件强类型model转化
- redis使用
一.基础类接口的实现
1.首先创建IConfigGeter接口
接口代码如下:
public interface IConfigGeter { TConfig Get<TConfig>(string key); TConfig Get<TConfig>(); String this[string key] { get; } }
2.实现接口
接口实现代码如下
/// <summary> /// 配置文件提供者 /// </summary> public class ConfigGeter : IConfigGeter { private readonly IConfiguration _configuration; public ConfigGeter(IConfiguration configuration) { _configuration = configuration; } public TConfig Get<TConfig>(string key) { if (string.IsNullOrWhiteSpace(key)) throw new ArgumentException("Value cannot be null or whitespace.", nameof(key)); var section = _configuration.GetSection(key); return section.Get<TConfig>(); } public TConfig Get<TConfig>() { return Get<TConfig>(typeof(TConfig).FullName); } public string this[string key] => _configuration[key]; }
3.创建一个ConfigLocator配置文件获取器
实现代码如下:
public class ConfigLocator { private readonly IConfigGeter _currentServiceProvider; private static IConfigGeter _serviceProvider; public ConfigLocator(IConfigGeter currentServiceProvider) { _currentServiceProvider = currentServiceProvider; } public static ConfigLocator Instance => new ConfigLocator(_serviceProvider); public static void SetLocatorProvider(IConfigGeter serviceProvider) { _serviceProvider = serviceProvider; } public TConfig Get<TConfig>(String key) { return _currentServiceProvider.Get<TConfig>(key); } public TConfig Get<TConfig>() { return _currentServiceProvider.Get<TConfig>(typeof(TConfig).Name); } public String this[string key] => _currentServiceProvider[key]; }
二.在program里将其注入,注意这里我没有放到startup
我们自定义了一个HostBuilder类,里面定义了两个方法:ProgramMain()和CreateDefaultBuilder();,
实现代码如下:
public static class HostBuilder { public static void ProgramMain(Action main) { main(); } /// <summary> /// 加入自定义默认配置 /// </summary> /// <param name="webHostBuilder"></param> /// <returns></returns> public static IWebHostBuilder CreateDefaultBuilder(this IWebHostBuilder webHostBuilder) => webHostBuilder.ConfigureAppConfiguration( (ctx, config) => ConfigLocator.SetLocatorProvider(new ConfigGeter(config.Build()))) .ConfigureServices((ctx, services) => { services .AddRegisterContainer(); }); }
注意:这里是我们使用配置文件的关键:
webHostBuilder.ConfigureAppConfiguration(
(ctx, config) => ConfigLocator.SetLocatorProvider(new ConfigGeter(config.Build())))
三.在控制器里使用一下我们的ConfigLocator试试效果如何
1.在appsetting.json里加一些配置信息
如图:
这里我们获取一下单键的值,以及复合类型的值,eg:Log4NetConfig,Persion,大家记得他们的值是多少我么在控制器里获取一下
2.新建测试控制器,为何不用单元测试呢?你们懂的,,,我就不多说了
如图:
代码如下:
namespace TB.AspNetCore.WebSite.Controllers { public class Persion { public string Name { get; set; } public int Age { get; set; } } public class TestController : Controller { public IActionResult Index() { var log4net = ConfigLocator.Instance["Log4NetConfig"]; var persion = ConfigLocator.Instance.Get<Persion>("Persion"); return View(); } } }
3.测试结果
快速监视结果显示是我们配置文件的值
本章就扯到这里吧,说多了就没意识了,下章会说一下Redis在我这里的玩法,会涉及到redis的发布订阅,以及redis的timeout问题
- 下载redis咱们唠唠嗑