[ASP.NET Core] 為讀取appsettings加上資料驗證

從Config讀取設定後,驗證資料正確性的三種方式

在開始前,先在appsetting.json定義了一個隨處可見的自訂設定

"MySetting": {
    "Id":123,
    "Name": "Test",
    "Data": ["A","B","C"]
  }

並且在Startup讀取配置

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            services.Configure<MyConfig>(Configuration.GetSection("MySetting"));
        }

第一種,在讀取到配置時,就會拋出Exception

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            services.AddOptions<MyConfig>().Configure(config =>
            {
                Configuration.Bind(config);
            }).Validate(config => config.Id!=0,"Id 不能等於0");
        }


第二種,為Config的屬性加上DataAnnotations的Attribute

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            services.AddOptions<MyConfig>().Configure(config =>
            {
                Configuration.Bind(config);
            }).ValidateDataAnnotations();
        }
    public class MyConfig
    {
        [Range(1, int.MaxValue)]
        public int Id { get; set; }

        public string Name { get; set; }

        public List<string> Data { get; set; }
    }


第三種,實作一個IValidateOptions<T>

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            services.AddOptions<MyConfig>().Configure(config =>
            {
                Configuration.Bind(config);
            }).Services.AddTransient<IValidateOptions<MyConfig>, MyConfigValidate>();
        }
    public class MyConfigValidate : IValidateOptions<MyConfig>
    {
        public ValidateOptionsResult Validate(string name, MyConfig options)
        {
            if (options.Id == 0)
            {
                return ValidateOptionsResult.Fail("id can not be 0");
            }
            return ValidateOptionsResult.Success;
        }
    }


Sample Code https://github.com/ianChen806/ConfigValidateSample