ASP.NET Core 2.2 基础知识(七) 选项模式

承接上一篇 配置,

选项模式是专门用类来表示相关配置的服务.

基本选项配置

新建一个选项类,该类必须是包含无参数的构造函数的非抽象类.

    public class MyOptions
    {
        public MyOptions()
        {
            Id = 1;
            Name = "refuge";
        }

        public int Id { get; set; }

        public string Name { get; set; }
    }

添加到服务容器,并绑定到配置:

    public class Startup
    {
        ......
        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            services.Configure<MyOptions>(Configuration);
        }
        ......
    }

测试控制器:

    [Route("api/[controller]/[action]")]
    [ApiController]
    public class TestController : ControllerBase
    {
        private readonly IOptions<MyOptions> _options;

        public TestController(IOptions<MyOptions> options)
        {
            _options = options;
            _config = config;
        }

        public MyOptions Get()
        {
            return _options.Value;
        }
    }

结果:

通过委托配置选项

        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<MyOptions>(options =>
            {
                //这些值会替代 MyOptions 构造函数中设置的值.
                //原因很简单,肯定是对象创建了,才会执行这个委托.
                options.Id = 2;
                options.Name = "refuge2";
            });
        }

通过文件配置简单选项

新建一个json文件:

{
  "Id": 3,
  "Name": "refuge3"
}
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            ConfigurationBuilder builder = new ConfigurationBuilder();
            IConfigurationRoot config = builder.AddJsonFile(path: @"E:\Git\Source\Repos\MyOption\Demo1\jsonconfig.json", optional: true, reloadOnChange: true).Build();
            services.Configure<MyOptions>(config);
        }

还可以读取文件中的某个节点配置简单选项

修改 json 文件,增加 subsection 节点.

{
  "Id": 3,
  "Name": "refuge3",
  "SubSection": {
    "Id": 4,
    "Name": "refuge4"
  }
}
        public void ConfigureServices(IServiceCollection services)
        {
            ConfigurationBuilder builder = new ConfigurationBuilder();
            IConfigurationRoot config = builder.AddJsonFile(@"E:\Git\Source\Repos\MyOption\Demo1\jsonconfig.json", true, true).Build();
            services.Configure<MyOptions>(config.GetSection("subsection"));
        }

上面这些例子中的获取到的 MyOptions 对象都是单例的.比如通过文件配置简单选项,即使 AddJsonFile 方法最后一个参数是 true ,配置数据也不会更新.要实现更新需要使用下面这个接口.

通过 IOptionsSnapshot 重新加载配置数据

修改 TestController :

[Route("api/[controller]/[action]")]
    [ApiController]
    public class TestController : ControllerBase
    {
        private readonly IOptionsSnapshot<MyOptions> _options;

        public TestController(IOptionsSnapshot<MyOptions> options)
        {
            _options = options;
        }
        public MyOptions Get()
        {
            return _options.Value;
        }    } 

第一次请求:

修改 json 文件后,刷新页面

通过别名配置选项

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            services.Configure<MyOptions>("option1", Configuration);
            services.Configure<MyOptions>("option2", options =>
            {
                options.Id = 6;
                options.Name = "refuge6";
            });
        }

修改 TestController

    [Route("api/[controller]/[action]")]
    [ApiController]
    public class TestController : ControllerBase
    {
        private readonly IOptionsSnapshot<MyOptions> _options;

        public TestController(IOptionsSnapshot<MyOptions> options)
        {
            _options = options;
        }

        public IEnumerable<MyOptions> Get()
        {
            for (int i = 1; i < 3; i++)
            {
                yield return _options.Get("option" + i);
            }
        }
    }

当启用多个配置服务时,指定的最后一个配置源优于其他源.

未完待续...

原文地址:https://www.cnblogs.com/refuge/p/10226271.html

时间: 2024-10-25 06:58:13

ASP.NET Core 2.2 基础知识(七) 选项模式的相关文章

ASP.NET Core 2.2 基础知识(六) 配置(内含MySql+EF)

原文:ASP.NET Core 2.2 基础知识(六) 配置(内含MySql+EF) 先上一段代码,了解一下 .NET Core 配置数据的结构. 新建一个 控制台项目,添加一个文件 json.json ,文件内容如下: { "country": "cn", "person": { "id": 1, "address": { "addName": "chengdu"

ASP.NET Core 2.2 基础知识(二) 中间件

原文:ASP.NET Core 2.2 基础知识(二) 中间件 中间件是一种装配到应用管道以处理请求和相应的软件.每个软件都可以: 1.选择是否将请求传递到管道中的下一个组件; 2.可在调用管道中的下一个组件前后执行工作. 管道由 IApplicationBuilder 创建: 每个委托都可以在下一个委托前后执行操作,.此外,委托还可以决定不将请求传递给下一个委托,这就是对请求管道进行短路.通常需要短路,是因为这样可以避免不必要的工作.比如: 1.静态文件中间件可以返回静态文件请求并使管道的其余

ASP.NET Core 2.2 基础知识(一) 依赖注入

原文:ASP.NET Core 2.2 基础知识(一) 依赖注入 依赖: 类A用到了类B,我们就说类A依赖类B.如果一个类没有任何地方使用到,那这个类基本上可以删掉了. public class Test { private MyDependency md = new MyDependency(); public void Print() { md.Print(); } } public class MyDependency { public void Print() { Console.Wri

ASP.NET Core 2.2 基础知识(十一) ASP.NET Core 模块

原文:ASP.NET Core 2.2 基础知识(十一) ASP.NET Core 模块 ASP.NET Core 应用与进程内的 HTTP 服务器实现一起运行.该服务器实现侦听 HTTP 请求,并在一系列请求功能被写到 HttpContext 时,将这些请求展现到应用中. ASP.NET Core 随附两种服务器实现: Kestrel 是适用于 ASP.NET Core 的默认跨平台 HTTP 服务器. HTTP.sys 是仅适用于 Windows 的 HTTP 服务器,它基于 HTTP.sy

ASP.NET Core 2.2 基础知识(五) 环境

原文:ASP.NET Core 2.2 基础知识(五) 环境 一.环境变量 系统启动时,会读取环境变量 ASPNETCORE_ENVIRONMENT ,并将该变量的值存储在 IHostingEnvironment.EnvironmentName 字段中.如: 新建一个 WebAPI 项目,修改 Configure 方法: public void Configure(IApplicationBuilder app, IHostingEnvironment env) { ...... { app.R

ASP.NET Core 2.2 基础知识(十六) SignalR 概述

原文:ASP.NET Core 2.2 基础知识(十六) SignalR 概述 我一直觉得学习的最好方法就是先让程序能够正常运行,才去学习他的原理,剖析他的细节. 就好像这个图: 所以,我们先跟着官方文档,创建一个 SignalR 应用: https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/signalr?view=aspnetcore-2.2&tabs=visual-studio 这个例子一共涉及到下面几个步骤: 自定义中心 ChatH

ASP.NET Core 2.2 基础知识(十二) 发送 HTTP 请求

可以注册 IHttpClientFactory 并将其用于配置和创建应用中的 HttpClient 实例. 这能带来以下好处: 提供一个中心位置,用于命名和配置逻辑 HttpClient 实例. 例如,可以注册 github 客户端,并将它配置为访问 GitHub. 可以注册一个默认客户端用于其他用途. 通过委托 HttpClient 中的处理程序整理出站中间件的概念,并提供适用于基于 Polly 的中间件的扩展来利用概念. 管理基础 HttpClientMessageHandler 实例的池和

ASP.NET Core 2.2 基础知识(十八) 托管和部署 概述

为了方便演示,以 .NET Core 控制台应用程序讲解. 我们新建一个控制台应用程序,安装 "Newtonsoft.Json" Nuget 包,然后右键点击该项目,选择"发布": 我们依次选择"文件",设置好路径,最后点击创建配置文件,界面变成了下面这样: 然后我们点击"配置" 那么,问题来了."部署模式" 里面有两个选项: 1.当选择框架依赖时,"目标运行时"有:"可移植&

ASP.NET Core 2.2 基础知识(四) URL重写中间件

说到URL重写就不得不提URL重定向. URL重定向 URL重定向是客户端操作,指示客户端访问另一个地址的资源.这需要往返服务器,并且当客户端对资源发出请求时,返回客户端的重定向URL会出现在浏览器的地址栏中. 将请求重定向到不同的URL时,可指示重定向是永久的还是临时的.如果是永久的,则使用"301"状态码.收到"301"状态码时,客户端可能会缓存.如果是临时的,则使用"302"状态码,以使客户端将来不应存储和重用重定向URL. 示例: 新建一