承接上一篇 配置,
選項模式是專門用類來表示相關配置的服務.
基本選項配置
新建一個選項類,該類必須是包含無參數的構造函數的非抽象類.
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); } } }
當啟用多個配置服務時,指定的最后一個配置源優於其他源.
未完待續...