15:选项框架:服务组件集成配置的最佳实践-开发实战
.NET Core开发实战前文传送门:
- 第1课:课程介绍
- 第2课:内容综述
- 第3课:.NET Core的现状、未来以及环境搭建
- 第4课:Startup:掌握ASP.NET Core的启动过程
- 第5课:依赖注入:良好架构的起点(上)
- 第5课:依赖注入:良好架构的起点(中)
- 第5课:依赖注入:良好架构的起点(下)
- 第6课:作用域与对象释放行为(上)
- 第6课:作用域与对象释放行为(下)
- 第7课:用Autofac增强容器能力(上)
- 第7课:用Autofac增强容器能力(下)
- 第8课:配置框架:让服务无缝适应各种环境
- 第9课:命令行配置提供程序
- 第10课:环境变量配置提供程序
- 第11课:文件配置提供程序
- 第12课:配置变更监听
- 第13课:配置绑定:使用强类型对象承载配置数据
- 第14课:自定义配置数据源:低成本实现定制化配置方案
15 | 选项框架:服务组件集成配置的最佳实践
这一节讲解如何使用选项框架来处理服务和配置的关系
选项框架的特性:
1、支持单例模式读取配置
2、支持快照
3、支持配置变更通知
4、支持运行时动态修改选项值
在设计系统的时候需要遵循两个原则:
1、接口分离原则(ISP),我们的类不应该依赖它不使用的配置
2、关注点分离(SoC),不同组件、服务、类之间的配置不应相互依赖或耦合
建议:
1、为我们的服务设计 XXXOptions
2、使用 IOptions、IOptionsSnapshot、IOptionsMonitor作为服务构造函数的参数
这样会让我们更快的实现服务配置的各种能力
源码链接:
https://github.com/witskeeper/geektime/tree/master/samples/OptionsDemo
在定义服务的时候,一般先定义服务接口
namespace OptionsDemo.Services { public interface IOrderService { int ShowMaxOrderCount(); } public class OrderService : IOrderService { OrderServiceOptions _options; public OrderService(OrderServiceOptions options) { _options = options; } public int ShowMaxOrderCount() { return _options.MaxOrderCount; } } // 代表从配置中读取的值 public class OrderServiceOptions { public int MaxOrderCount { get; set; } = 100; } }
接着是服务注册
public void ConfigureServices(IServiceCollection services) { services.AddSingleton<OrderServiceOptions>(); services.AddSingleton<IOrderService, OrderService>(); }
接着是控制器的定义
[HttpGet] public int Get([FromServices]IOrderService orderService) { Console.WriteLine($"orderService.ShowMaxOrderCount:{orderService.ShowMaxOrderCount()}"); return 1; }
启动程序,输出如下:
orderService.ShowMaxOrderCount:100
如果说我们需要把这个值跟配置绑定,怎么做呢?
首先需要引入 Options 框架
ASP.NET Core 实际上已经默认帮我们把框架引入进来了
命名空间是:Microsoft.Extensions.Options
我们需要修改一下服务的入参
public class OrderService : IOrderService { //OrderServiceOptions _options; IOptionsMonitor<OrderServiceOptions> _options; //public OrderService(OrderServiceOptions options) public OrderService(IOptionsMonitor<OrderServiceOptions> options) { _options = options; } public int ShowMaxOrderCount() { //return _options.MaxOrderCount; return _options.Value.MaxOrderCount; } }
注册的时候使用 config 方法,从配置文件读取
public void ConfigureServices(IServiceCollection services) { //services.AddSingleton<OrderServiceOptions>(); services.Configure<OrderServiceOptions>(Configuration.GetSection("OrderService")); services.AddSingleton<IOrderService, OrderService>(); }
配置文件
{ "OrderService": { "MaxOrderCount": 200 } }
启动程序,输出如下:
orderService.ShowMaxOrderCount:200
可以看到,输出的值为200,说明配置与选项已经完成绑定
服务只依赖了 OrderServiceOptions,并没有依赖配置框架,也就是说服务只关心配置的值是什么,它并不关心配置的值从哪里来,解除了配置与服务之间的依赖
另外可以为所有的服务分别设计它们的 Options,这样服务之间的选项配置也都不会互相依赖

原文出处:微信公众号【DotNet NB】,作者【郑子铭】
原文链接:https://mp.weixin.qq.com/s/f4A9kBbdUjzsCfKRjjlEgA
本文观点不代表Dotnet9立场,转载请联系原作者。