承接上一篇 配置,

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

基本选项配置

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

    public class MyOptions
{
public MyOptions()
{
Id = ;
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 = ;
options.Name = "refuge2";
});
}

通过文件配置简单选项

新建一个json文件:

{
"Id": ,
"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": ,
"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 = ; i < ; i++)
{
yield return _options.Get("option" + i);
}
}
}

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

未完待续...

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

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

    为了方便演示,以 .NET Core 控制台应用程序讲解. 我们新建一个控制台应用程序,安装 "Newtonsoft.Json" Nuget 包,然后右键点击该项目,选择" ...

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

    可以注册 IHttpClientFactory 并将其用于配置和创建应用中的 HttpClient 实例. 这能带来以下好处: 提供一个中心位置,用于命名和配置逻辑 HttpClient 实例. 例如 ...

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

    先上一段代码,了解一下 .NET Core 配置数据的结构. 新建一个 控制台项目,添加一个文件 json.json ,文件内容如下: { "country": "cn& ...

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

    我一直觉得学习的最好方法就是先让程序能够正常运行,才去学习他的原理,剖析他的细节. 就好像这个图: 所以,我们先跟着官方文档,创建一个 SignalR 应用: https://docs.microso ...

  5. ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)

    要啥自行车,直接看手表 //返回基元类型 public string Get() { return "hello world"; } //返回复杂类型 public Person ...

  6. ASP.NET Core 2.2 基础知识(十三) WebAPI 概述

    我们先创建一个 WebAPI 项目,看看官方给的模板到底有哪些东西 官方给出的模板: [Route("api/[controller]")] [ApiController] pub ...

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

    ASP.NET Core 应用与进程内的 HTTP 服务器实现一起运行.该服务器实现侦听 HTTP 请求,并在一系列请求功能被写到 HttpContext 时,将这些请求展现到应用中. ASP.NET ...

  8. ASP.NET Core 2.2 基础知识(十) Web服务器 - Kestrel

    ASP.NET Core 应用与进程内的 HTTP 服务器实现一起运行.该服务器实现侦听 HTTP 请求,并在一系列请求功能被写到 HttpContext 时,将这些请求展现到应用中. ASP.NET ...

  9. ASP.NET Core 2.2 基础知识(九) 使用托管服务实现后台任务

    在 ASP.NET Core 中,后台任务作为托管服务实现.托管服务是一个类,而且必须实现 IHostedService 接口,该接口定义了两个方法: StartAsync(CancellationT ...

随机推荐

  1. AtCoder Code Festival 2017 Team Relay J - Indifferent

    题目大意:共$2n$个价格$p_i$.两人轮流取.你每次取最大的,对方每次随机取.问你取的期望和是多少. 题解:从小到大排序,$\sum\limits_{i=0}^{2n-1} \frac{i*p_i ...

  2. [NOI.AC省选模拟赛3.30] Mas的童年 [二进制乱搞]

    题面 传送门 思路 这题其实蛮好想的......就是我考试的时候zz了,一直没有想到标记过的可以不再标记,总复杂度是$O(n)$ 首先我们求个前缀和,那么$ans_i=max(pre[j]+pre[i ...

  3. php: Can't use function return value in write context

    关于empty()函数, php手册中提到,php5.5之前empty()函数只支持检查变量,传入任何其他的表达式或函数都会产生语法错误. Note: Prior to PHP 5.5, empty( ...

  4. 2016广东工业大学校赛 E题 GDUT-oj1173

    Problem E: 积木积水 Description 现有一堆边长为1的已经放置好的积木,小明(对的,你没看错,的确是陪伴我们成长的那个小明)想知道当下雨天来时会有多少积水.小明又是如此地喜欢二次元 ...

  5. 自定义orderBy字母函数

    orderedUsers: function () { var arr = this.users; for (var i = 0; i < arr.length - 1; i++) { for ...

  6. SQL优化之一

    使用union代替or,可以提升查询效率. 使用or时,会自动放弃已有的索引

  7. 04-plis属性列表

      源代码下载链接:04-plis属性列表.zip27.8 KB // MJPerson.h // //  MJPerson.h //  04-plis属性列表 // //  Created by a ...

  8. sql 批量更新表中多字段为不同的值

    ,),,),rand()) select newid() ,) update tablename , FB,)) , ), FC,)) , )

  9. bzoj 1009 DP+矩阵加速

    我们用DP来解决这个问题 W[I,J]表示准考证的第I位,和不吉利的数匹配到了第J位的方案数,这个状态的表示也可以看成 当前到第I位了,准考证的后J位是不吉利的数的前J位,的方案数 那么我们最后的an ...

  10. SELinux 案例 2

    普通进程权限白名单 sepolicy generate --application [-n NAME] [-u USER ]command [-w WRITE_PATH ]