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);
            }
        }
    }

 

 

當啟用多個配置服務時,指定的最后一個配置源優於其他源.

 

未完待續...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM