ASP.NET Core 2.2 基础知识(七) 选项模式
承接上一篇 配置,
选项模式是专门用类来表示相关配置的服务.
基本选项配置
新建一个选项类,该类必须是包含无参数的构造函数的非抽象类.
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 基础知识(七) 选项模式的更多相关文章
- ASP.NET Core 2.2 基础知识(十八) 托管和部署 概述
为了方便演示,以 .NET Core 控制台应用程序讲解. 我们新建一个控制台应用程序,安装 "Newtonsoft.Json" Nuget 包,然后右键点击该项目,选择" ...
- ASP.NET Core 2.2 基础知识(十二) 发送 HTTP 请求
可以注册 IHttpClientFactory 并将其用于配置和创建应用中的 HttpClient 实例. 这能带来以下好处: 提供一个中心位置,用于命名和配置逻辑 HttpClient 实例. 例如 ...
- ASP.NET Core 2.2 基础知识(六) 配置(内含MySql+EF)
先上一段代码,了解一下 .NET Core 配置数据的结构. 新建一个 控制台项目,添加一个文件 json.json ,文件内容如下: { "country": "cn& ...
- ASP.NET Core 2.2 基础知识(十六) SignalR 概述
我一直觉得学习的最好方法就是先让程序能够正常运行,才去学习他的原理,剖析他的细节. 就好像这个图: 所以,我们先跟着官方文档,创建一个 SignalR 应用: https://docs.microso ...
- ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)
要啥自行车,直接看手表 //返回基元类型 public string Get() { return "hello world"; } //返回复杂类型 public Person ...
- ASP.NET Core 2.2 基础知识(十三) WebAPI 概述
我们先创建一个 WebAPI 项目,看看官方给的模板到底有哪些东西 官方给出的模板: [Route("api/[controller]")] [ApiController] pub ...
- ASP.NET Core 2.2 基础知识(十一) ASP.NET Core 模块
ASP.NET Core 应用与进程内的 HTTP 服务器实现一起运行.该服务器实现侦听 HTTP 请求,并在一系列请求功能被写到 HttpContext 时,将这些请求展现到应用中. ASP.NET ...
- ASP.NET Core 2.2 基础知识(十) Web服务器 - Kestrel
ASP.NET Core 应用与进程内的 HTTP 服务器实现一起运行.该服务器实现侦听 HTTP 请求,并在一系列请求功能被写到 HttpContext 时,将这些请求展现到应用中. ASP.NET ...
- ASP.NET Core 2.2 基础知识(九) 使用托管服务实现后台任务
在 ASP.NET Core 中,后台任务作为托管服务实现.托管服务是一个类,而且必须实现 IHostedService 接口,该接口定义了两个方法: StartAsync(CancellationT ...
随机推荐
- AtCoder Code Festival 2017 Team Relay J - Indifferent
题目大意:共$2n$个价格$p_i$.两人轮流取.你每次取最大的,对方每次随机取.问你取的期望和是多少. 题解:从小到大排序,$\sum\limits_{i=0}^{2n-1} \frac{i*p_i ...
- [NOI.AC省选模拟赛3.30] Mas的童年 [二进制乱搞]
题面 传送门 思路 这题其实蛮好想的......就是我考试的时候zz了,一直没有想到标记过的可以不再标记,总复杂度是$O(n)$ 首先我们求个前缀和,那么$ans_i=max(pre[j]+pre[i ...
- php: Can't use function return value in write context
关于empty()函数, php手册中提到,php5.5之前empty()函数只支持检查变量,传入任何其他的表达式或函数都会产生语法错误. Note: Prior to PHP 5.5, empty( ...
- 2016广东工业大学校赛 E题 GDUT-oj1173
Problem E: 积木积水 Description 现有一堆边长为1的已经放置好的积木,小明(对的,你没看错,的确是陪伴我们成长的那个小明)想知道当下雨天来时会有多少积水.小明又是如此地喜欢二次元 ...
- 自定义orderBy字母函数
orderedUsers: function () { var arr = this.users; for (var i = 0; i < arr.length - 1; i++) { for ...
- SQL优化之一
使用union代替or,可以提升查询效率. 使用or时,会自动放弃已有的索引
- 04-plis属性列表
源代码下载链接:04-plis属性列表.zip27.8 KB // MJPerson.h // // MJPerson.h // 04-plis属性列表 // // Created by a ...
- sql 批量更新表中多字段为不同的值
,),,),rand()) select newid() ,) update tablename , FB,)) , ), FC,)) , )
- bzoj 1009 DP+矩阵加速
我们用DP来解决这个问题 W[I,J]表示准考证的第I位,和不吉利的数匹配到了第J位的方案数,这个状态的表示也可以看成 当前到第I位了,准考证的后J位是不吉利的数的前J位,的方案数 那么我们最后的an ...
- SELinux 案例 2
普通进程权限白名单 sepolicy generate --application [-n NAME] [-u USER ]command [-w WRITE_PATH ]