ASP.NET Core中可以使用Options模式,从而能够使用强类型的类来表达配置项,这也是实现配置的最佳实践。
对外提供的配置项接口有IOptions<TOptions>,IOptionsMonitor<TOptions>,IOptionsSnapshot<TOptions>,这三种适用于不同的场景:
- IOptions<TOptions> 单例,不支持数据变化(重启更新),性能高
- IOptionsMonitor<TOptions> 单例,实时变更(侦听器OnChange)
- IOptionsSnapshot<TOptions> 作用域注册,单次请求内不变
举个例子
1、appsettings.json
{
"AppSettings": {
"SystemName": "我的网站---1111"
}
}
2、实体
public class Configs
{
public Dictionary<string, string> AppSettings { get; set; }
}
3、在Startup中的ConfigureServices方法中注册服务
services.Configure<Configs>(Configuration);
4、控制器代码
//单例,不支持数据变化(重启更新),性能高
private readonly IOptions<Configs> _OptConfig;
//单例,实时变更(侦听器OnChange)
private readonly IOptionsMonitor<Configs> _OptMonitorConfig;
//作用域注册,单次请求内不变
private readonly IOptionsSnapshot<Configs> _OptSnapshotConfig;
public HomeController(IOptions<Configs> optConfig, IOptionsMonitor<Configs> optMonitorConfig, IOptionsSnapshot<Configs> optSnapshotConfig)
{
this._OptConfig = optConfig;
this._OptMonitorConfig = optMonitorConfig;
this._OptSnapshotConfig = optSnapshotConfig;
}
public IActionResult Index()
{
//修改前 【我的网站---1111】
ViewBag.SystemName1 = _OptConfig.Value.AppSettings["SystemName"];
ViewBag.SystemName2 = _OptMonitorConfig.CurrentValue.AppSettings["SystemName"];
ViewBag.SystemName3 = _OptSnapshotConfig.Value.AppSettings["SystemName"];
Thread.Sleep(3000);//休息3秒---去修改文件值 【我的网站---2222】
ViewBag.SystemName1_2 = _OptConfig.Value.AppSettings["SystemName"];
ViewBag.SystemName2_2 = _OptMonitorConfig.CurrentValue.AppSettings["SystemName"];
ViewBag.SystemName3_2 = _OptSnapshotConfig.Value.AppSettings["SystemName"];
return View();
}
5、Index.cshtml
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<div>
<h2>修改前【我的网站---1111】</h2>
<p>IOptions=@ViewBag.SystemName1</p>
<p>IOptionsMonitor=@ViewBag.SystemName2</p>
<p>IOptionsSnapshot=@ViewBag.SystemName3</p>
</div>
<div>
<h2>修改后 【我的网站---2222】</h2>
<p>IOptions=@ViewBag.SystemName1_2</p>
<p>IOptionsMonitor=@ViewBag.SystemName2_2</p>
<p>IOptionsSnapshot=@ViewBag.SystemName3_2</p>
</div>
</div>
执行结果
- 第一次查看页面(修改appsettings.json文件)
- 第二次查看页面(不修改appsettings.json)
结论
- 经常修改-配置文件:
那么首先考虑IOptionsMonitor<>,如果不合适接着考虑IOptionsSnapshot<>
IOptionsMonitor 在耗时操作的同一个请求中,值可能存在不一致的情况—当你正在修改配置文件的时候——可能会引发一些奇怪的bug(出现的概率小)。 - 不经常修改-配置文件:
可以考虑 IOptions<> ,性能最高