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. php开发之文件读取、写入

    前言 续之前的系列,这里php开发的文件操作的内容读取以及文本写入的部分 文件读取代码的实现 css代码 本系列的php博客都是这个css,名字都是index.css /* css样式初始化 */ * ...

  2. Verdi基础-01

    Verdi使用目标 生成fsdb波形 查看fsdb波形 追踪RTL代码 目录 Verdi历史 生成fsdb波形 三个变量&&三个命令 变量PATH LD_LIBRARY_PATH so ...

  3. Git-基本介绍

  4. VMto阿里云的简单过程

    VMto阿里云的简单过程 第一步打开网站 https://smcnext.console.aliyun.com/sourceServers/importMigrationSource?spm=5176 ...

  5. ARMv8.0下duckdb的安装与编译过程-解决 Failed to allocate block of 2048 bytes

    ARMv8.0下duckdb的安装与编译过程-解决 Failed to allocate block of 2048 bytes 背景 duckdb 是一个很流行的单机版数据库引擎 同事下载了相关的预 ...

  6. [转帖]《Linux性能优化实战》笔记(22)—— 网络丢包问题分析

    所谓丢包,是指在网络数据的收发过程中,由于种种原因,数据包还没传输到应用程序中,就被丢弃了.这些被丢弃包的数量,除以总的传输包数,也就是我们常说的丢包率.丢包率是网络性能中最核心的指标之一.丢包通常会 ...

  7. 【转帖】QUIC协议简史

    QUIC简史 QUIC(Quick UDP Internet Connection)是谷歌推出的一套基于UDP的传输协议,它实现了TCP + HTTPS + HTTP/2的功能,目的是保证可靠性的同时 ...

  8. [转帖]Linux中的Page cache和Buffer cache详解

    1.内存情况 在讲解Linux内存管理时已经提到,当你在Linux下频繁存取文件后,即使系统上没有运行许多程序,也会占用大量的物理内存.这是因为当你读写文件的时候,Linux内核为了提高读写的性能和速 ...

  9. [转帖]Kdump配置及使用(详细)总结(二)

    一.简介 本文主要介绍如何打开Kdump并对其相关文件进行配置.前面章节已经对Kdump调试机理进行总结总结,具体可以点击下面链接: Kdump调试机理总结(一) crash工具分析vmcore文件常 ...

  10. [转帖] Linux命令拾遗-理解系统负载

    https://www.cnblogs.com/codelogs/p/16060498.html 简介# 这是Linux命令拾遗系列的第七篇,本篇主要介绍Linux中负载的概念与问题诊断方法. 本系列 ...