首页 > 编程语言 >ASP.NET Core中选项的应用和总结

ASP.NET Core中选项的应用和总结

时间:2022-11-14 13:58:25浏览次数:47  
标签:选项 Core positionOptions ASP string options NET public Configure

在前面的文章中,我们介绍过将appsetting等配置文件映射到实体的的方式
https://www.cnblogs.com/fei686868/p/16779249.html

这里呢,我们介绍关于选项的另一种用法,就是通过IOptions等选项来使用。

他们的区别呢,以前那种是只实现映射,如果要注入,需要自己写注入代码;但使用IOptions等方式呢,是自动注入了,我们无需再写注入代码,

显得更简洁,同时呢,扩展性更强。

本文示例环境:netcore3.1

为了演示代码,我们在appsetting.json中新增一个配置和实体

  "Position": {
    "Title": "这个是标题",
    "Name": "这个是名称"
  }
    public class PositionOptions
    {
        public const string Position = "Position"; //定义节点名称,与配置对应。这边定义只是为了方便管理,不用到处写字符串

        public string Title { get; set; }
        public string Name { get; set; }
    }

我们先看个简单的写法:

 services.Configure<实体名称>(Configuration.GetSection("配置文件中的节点名称"));

这里我们采用的是services自带的Configure<>方法进行处理。

下面上实际代码:

Startup.cs中配置

      public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<PositionOptions>(Configuration.GetSection(PositionOptions.Position)); //映射和注入
           
        }

应用:

    public class PositionController : Controller
    {
        private readonly PositionOptions _positionOptions;
        public PositionController(IOptions<PositionOptions> options) //通过IOption实现注入
        {
            _positionOptions = options.Value;  //获取对应的Value即可
        }
        public IActionResult Index()
        {
            string str = _positionOptions.Name; //这边就能获取到配置的Name了

            return View();
        }
    }

 

上面我们采用IOptions对象来处理,该方式呢,有个注意点:
不会读取在应用启动后对 JSON 配置文件所做的更改

就是启动时读取而已,如果配置文件改了,不会热重载。但是在现实中,我们该配置,那还真会有。咋整?

选项有3种接口模式:

1、IOptions<TOptions>
  不支持热重载

  不支持命名选项(下面会讲什么是命名选项)

  注册为单一实例且可以注入到任何服务生存期

2、IOptionsSnapshot<TOptions>

   支持热重载,就是配置文件修改后,会更新。

   注册为Scope类型,因此无法注入到单一实例服务

   支持命名选项

3、IOptionsMonitor<TOptions>

    用于检索选项并管理 TOptions 实例的选项通知

    注册为单一实例且可以注入到任何服务生存期。

    支持更改通知、命名选项、热重载

 

不管用什么方式,不影响Startup.cs中服务注入的Configure 方法的写法。

对于日常项目应用来说,主要就是热重载的区别。不同方式,性能影响也不太一样。虽然有时候可以忽略性能差异。

有些配置是启动后,就不需要再修改的,可以采用IOptions。否则,请使用后面两种。

但相对来说,第3种更适合一点。

我们看看写法

IOptionsSnapshot 写法

    public class PositionController : Controller
    {
        private readonly PositionOptions _positionOptions;
        public PositionController(IOptionsSnapshot<PositionOptions> options) //通过IOption实现注入
        {
            _positionOptions = options.Value;  //获取对应的Value即可
        }
        public IActionResult Index()
        {
            string str = _positionOptions.Name; //这边就能获取到配置的Name了

            return View();
        }
    }

IOptionsMonitor 写法

    public class PositionController : Controller
    {
        private readonly PositionOptions _positionOptions;
        public PositionController(IOptionsMonitor<PositionOptions> options) //通过IOption实现注入
        {
            _positionOptions = options.CurrentValue;  //获取对应的Value即可
        }
        public IActionResult Index()
        {
            string str = _positionOptions.Name; //这边就能获取到配置的Name了

            return View();
        }
    }

三者,写法基本相同。

那我们先做个小总结
1、IOptions ,注册为单例,不支持热重载。
2、IOptionsSnapshot,注册为Scope范围,支持热重载

3、IOptionsMonitor,注册为单例,支持热重载。

下面我们再介绍下命名选项的情况,仅 IOptionsSnapshot和IOptionsMonitor 二者支持

我们换个例子,改下配置

{ 
"班级情况": {
    "1班": {
      "StudentCount": 50,
      "AvgScore": 80
    },
    "2班": {
      "StudentCount":60,
      "AvgScore": 90
    }
  }
}

加入配置是这样的,那我们需要分别获取1班和2班的学生数和平均分,怎么获取?

我们分析这种情况,出现了同层级,key名称不一样(1班,2班,这就是命名选项,同层级,不同key),而每个key对象的子内容是里面是格式是一样的。

我们就这么写,定义实体

    public class ClassData
    {
 public const string NodeName = "班级情况"; public const string ClasName1 = "1班"; public const string ClassName2 = "2班"; public int StudentCount { get; set; } public int AvgScore { get; set; } }

实体中,我们定义了两个变量与节点一一对应

注入的时候是有变化的

   services.Configure<ClassData>( ClassData.ClassName1,Configuration.GetSection("班级情况:1班"));
            services.Configure<ClassData>(ClassData.ClassName2, Configuration.GetSection("班级情况:2班"));

看到了没,得写2个,分别写。实体类型都一样,但是 Configure方法的name参数不一样。

应用端:

 private readonly ClassData _classData1;//1班
        private readonly ClassData _classData2;//2班
        public PositionController(IOptionsSnapshot<ClassData> options) //通过IOption实现注入
        {
            _classData1 = options.Get(ClassData.ClassName1); //分别获取定义的name对应的数据
            _classData2 = options.Get(ClassData.ClassName2);
        }

再获取数据时,需要用这种方式来获取。

看起来是一小点的知识,其实在很多组件封装上很实用。比如Abp就很多Configure方法,自己用多了,就更能理解了

以上,就是关于选项的一些小应用和总结。

更多分享,请大家关注我的个人公众号:

 

标签:选项,Core,positionOptions,ASP,string,options,NET,public,Configure
From: https://www.cnblogs.com/fei686868/p/16888680.html

相关文章

  • VMware Aria Operations for Networks 6.8 - 网络和应用监控工具
    请访问原文链接:VMwareAriaOperationsforNetworks6.8-网络和应用监控工具,查看最新版。原创作品,转载请保留出处。作者主页:www.sysin.orgVMwareAriaOperationsfo......
  • k8s工作原理(chrono《kubernetes入门实战课》笔记整理)
     【架构理解】k8s可以编排容器,也可以对服务器进行监管。在k8s,不会区分dev(开发人员)和ops(运维人员),而是devops(提倡开发时就要考虑运维,运维也要尽早开始考虑如何对应用进行运......
  • DB2 .NET Data Provider, reason code 10
    最近使用DB2.NETDataProvider访问DB2报了reasoncode10,解决废了很大力气,记录一下错误现象:SQL1159InitializationerrorwithDB2.NETDataProvider,reasoncode......
  • 【NET微服务】微服务简介
    一、什么是微服务微服务是一种架构风格,它要求我们在开发一个应用的时候,这个应用必须构建成一系列小服务的组合;可以通过http的方式进行互通。二、单体应用架构所谓单体应......
  • .net网络请求
    varhttpClient=newHttpClient();//实例化一个请求对象httpClient.DefaultRequestHeaders.Add("Authorization","eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.......
  • 篇(11)-Asp.Net Core入门实战-用户登录,记录Cookie,使用Session
    入门实战-用户登录,记录Cookie,使用Session用户登录功能是做项目开发的必备功能,各个业务点中都要读取和使用用户信息,所以用户登录,并记录用户信息可以使用Cookie,Session等功......
  • .net core iis 部署时通用的web.config配置
    <?xmlversion="1.0"encoding="utf-8"?><configuration><locationpath="."inheritInChildApplications="false"><system.webServer><handlers><add......
  • MES工单工艺线路条码系统NetMVC源码
    概述    系统操作分为两部分:一、生产主管:进入系统设置工单、设置产品扫描工站、设置每个工站扫描的物料条码、维护物料表。二、产线工人:扫描条码。......
  • ASP.NET Core教程-Configuration(配置)-配置运行环境
    更新记录转载请注明出处:2022年11月14日发布。2022年11月12日从笔记迁移到博客。配置运行环境在程序启动时,会读取ASPNETCORE_ENVIRONMENT环境变量的值。如果它的......
  • .NET应用开发之SQLServer常见问题分析
    日常我们开发.NET应用时会使用SQLServer数据库,对于SQLServer数据库的日常开发有一些技能和工具,准备给大家分享一下。一、场景1:SQLServer死锁分析 执行以下SQL,启用SQLSe......