15 | 选项框架:服务组件集成配置的最佳实践

这一节讲解如何使用选项框架来处理服务和配置的关系

选项框架的特性:

1、支持单例模式读取配置

2、支持快照

3、支持配置变更通知

4、支持运行时动态修改选项值

在设计系统的时候需要遵循两个原则:

1、接口分离原则(ISP),我们的类不应该依赖它不使用的配置

2、关注点分离(SoC),不同组件、服务、类之间的配置不应相互依赖或耦合

建议:

1、为我们的服务设计 XXXOptions

2、使用 IOptions、IOptionsSnapshot、IOptionsMonitor作为服务构造函数的参数

这样会让我们更快的实现服务配置的各种能力

在定义服务的时候,一般先定义服务接口

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;
}

注释默认方法

//[HttpGet]
//public IEnumerable<WeatherForecast> Get()
//{
// var rng = new Random();
// return Enumerable.Range(1, 5).Select(index => new WeatherForecast
// {
// Date = DateTime.Now.AddDays(index),
// TemperatureC = rng.Next(-20, 55),
// Summary = Summaries[rng.Next(Summaries.Length)]
// })
// .ToArray();
//}

启动程序,输出如下:

orderService.ShowMaxOrderCount:100

如果说我们需要把这个值跟配置绑定,怎么做呢?

首先需要引入 Options 框架

ASP.NET Core 实际上已经默认帮我们把框架引入进来了

命名空间是:Microsoft.Extensions.Options

我们需要修改一下服务的入参

public class OrderService : IOrderService
{
//OrderServiceOptions _options;
IOptions<OrderServiceOptions> _options; //public OrderService(OrderServiceOptions options)
public OrderService(IOptions<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>();
}

配置文件 appsettings.json

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"OrderService": {
"MaxOrderCount": 200
}
}

启动程序,输出如下:

orderService.ShowMaxOrderCount:200

可以看到,输出的值为200,说明配置与选项已经完成绑定

服务只依赖了 OrderServiceOptions,并没有依赖配置框架,也就是说服务只关心配置的值是什么,它并不关心配置的值从哪里来,解除了配置与服务之间的依赖

另外可以为所有的服务分别设计它们的 Options,这样服务之间的选项配置也都不会互相依赖

GitHub源码链接:

https://github.com/MingsonZheng/DotNetCoreDevelopmentActualCombat/tree/main/OptionsDemo

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

.NET Core开发实战(第15课:选项框架:服务组件集成配置的最佳实践)--学习笔记的更多相关文章

  1. 2月送书福利:ASP.NET Core开发实战

    大家都知道我有一个公众号“恰童鞋骚年”,在公众号2020年第一天发布的推文<2020年,请让我重新介绍我自己>中,我曾说到我会在2020年中每个月为所有关注“恰童鞋骚年”公众号的童鞋们送一 ...

  2. WCF开发实战系列四:使用Windows服务发布WCF服务

    WCF开发实战系列四:使用Windows服务发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇文章中我们通过编写的控制台程序或WinForm程序来为本 ...

  3. 移动App測试实战:顶级互联网企业软件測试和质量提升最佳实践

    这篇是计算机类的优质预售推荐>>>><移动App測试实战:顶级互联网企业软件測试和质量提升最佳实践> 国内顶级互联网公司測试实战经验总结.阿里.腾讯.京东.携程.百 ...

  4. [ASP.NET Core开发实战]开篇词

    前言 本系列课程文章主要是学习官方文档,再输出自己学习心得,希望对你有所帮助. 课程大纲 本系列课程主要分为三个部分:基础篇.实战篇和部署篇. 希望通过本系列课程,能让大家初步掌握使用ASP.NET ...

  5. [ASP.NET Core开发实战]基础篇02 依赖注入

    ASP.NET Core的底层机制之一是依赖注入(DI)设计模式,因此要好好掌握依赖注入的用法. 什么是依赖注入 我们看一下下面的例子: public class MyDependency { pub ...

  6. 基于ASP.Net Core开发的一套通用后台框架

    基于ASP.Net Core开发一套通用后台框架 写在前面 这是本人在学习的过程中搭建学习的框架,如果对你有所帮助那再好不过.如果您有发现错误,请告知我,我会第一时间修改. 知其然,知其所以然,并非重 ...

  7. .NET Core开发实战(第11课:文件配置提供程序)--学习笔记

    11 | 文件配置提供程序:自由选择配置的格式 文件配置提供程序 Microsoft.Extensions.Configuration.Ini Microsoft.Extensions.Configu ...

  8. [ASP.NET Core开发实战]基础篇01 Startup

    Startup,顾名思义,就是启动类,用于配置ASP.NET Core应用的服务和请求管道. Startup有两个主要作用: 通过ConfigureServices方法配置应用的服务.服务是一个提供应 ...

  9. 2、SpringBoot接口Http协议开发实战8节课(1-6)

    1.SpringBoot2.xHTTP请求配置讲解 简介:SpringBoot2.xHTTP请求注解讲解和简化注解配置技巧 1.@RestController and @RequestMapping是 ...

  10. [ASP.NET Core开发实战]基础篇05 服务器

    什么是服务器 服务器指ASP.NET Core应用运行在操作系统上的载体,也叫Web服务器. Web服务器实现侦听HTTP请求,并以构建HttpContext的对象发送给ASP.NET Core应用. ...

随机推荐

  1. 深入理解dom加载过程

  2. Transformer的应用

    Transformer 写在前面 本学期学习了NLP的课程,本小菜鸡结合做的课设(基于Transformer的英文文档摘要系统的设计与实现),来写一下有关于Transformer的相关内容吧,有问题之 ...

  3. LLM面面观之LLM上下文扩展方案

    1. 背景 本qiang~这段时间调研了LLM上下文扩展的问题,并且实打实的运行了几个开源的项目,所谓实践与理论相结合嘛! 此文是本qiang~针对上下文扩展问题的总结,包括解决方案的整理概括,文中参 ...

  4. C# WPF:快把文件从桌面拖进我的窗体来!

    首发公众号:Dotnet9 作者:沙漠之尽头的狼 日期:202-11-27 一.本文开始之前 上传文件时,一般是提供一个上传按钮,点击上传,弹出文件(或者目录选择对话框),选择文件(或者目录)后,从对 ...

  5. 【Python】.format用法

    格式化打印 print("***{}".format(args))   格式化转换 module = "skull" print "MODULE_{} ...

  6. 【TouchGFX】AnalogClock 小部件使用小记

  7. [转帖]日常Bug排查-读从库没有原子性?

    https://zhuanlan.zhihu.com/p/658508920 3 人赞同了该文章 日常Bug排查系列都是一些简单Bug排查.问题虽小,但经常遇到,了解这些问题,会让我们少走点弯路,提升 ...

  8. [转帖]ls 只显示目录

    https://www.cnblogs.com/lavin/p/5912369.html 只显示目录: ls -d */ 在实际应用中,我们有时需要仅列出目录,下面是 4 种不同的方法. 1. 利用 ...

  9. [转帖]Linux之bash反弹shell原理浅析

    环境 攻击机:kali            ip:192.168.25.144 靶    机:centos      ip:192.168.25.142 过程 kali 监听本地8888端口 靶机 ...

  10. [转贴]一图弄懂ASCII、GB2312、GBK、GB18030编码

    一图弄懂ASCII.GB2312.GBK.GB18030编码 https://blog.csdn.net/LightUpHeaven/article/details/92008630 转载君子不器.  ...