前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET Core开发实战(第15课:选项框架:服务组件集成配置的最佳实践)--学习笔记

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

作者头像
郑子铭
发布2021-01-13 15:24:43
6040
发布2021-01-13 15:24:43
举报
文章被收录于专栏:DotNet NB && CloudNative

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

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

选项框架的特性:

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

2、支持快照

3、支持配置变更通知

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

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

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

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

建议:

1、为我们的服务设计 XXXOptions

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

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

源码链接: https://github.com/witskeeper/geektime/tree/master/samples/OptionsDemo

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

代码语言:javascript
复制
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;
    }
}

接着是服务注册

代码语言:javascript
复制
public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<OrderServiceOptions>();
    services.AddSingleton<IOrderService, OrderService>();
}

接着是控制器的定义

代码语言:javascript
复制
[HttpGet]
public int Get([FromServices]IOrderService orderService)
{
    Console.WriteLine($"orderService.ShowMaxOrderCount:{orderService.ShowMaxOrderCount()}");
    return 1;
}

启动程序,输出如下:

代码语言:javascript
复制
orderService.ShowMaxOrderCount:100

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

首先需要引入 Options 框架

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

命名空间是:Microsoft.Extensions.Options

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

代码语言:javascript
复制
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 方法,从配置文件读取

代码语言:javascript
复制
public void ConfigureServices(IServiceCollection services)
{
    //services.AddSingleton<OrderServiceOptions>();
    services.Configure<OrderServiceOptions>(Configuration.GetSection("OrderService"));
    services.AddSingleton<IOrderService, OrderService>();
}

配置文件

代码语言:javascript
复制
{
  "OrderService": {
    "MaxOrderCount": 200
  }
}

启动程序,输出如下:

代码语言:javascript
复制
orderService.ShowMaxOrderCount:200

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 15 | 选项框架:服务组件集成配置的最佳实践
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档