三种验证方法

  • 直接注册验证函数
  • 实现IValidateOptions
  • 使用Microsoft.Extensions.Options.DataAnnotations

示例

直接注册验证函数
继续使用上一节代码,需要稍微修改一点代码。

  1. using Microsoft.Extensions.Configuration;
  2. using OptionsDemo.Services;
  3. namespace Microsoft.Extensions.DependencyInjection
  4. {
  5. public static class OrderServiceExtensions
  6. {
  7. public static IServiceCollection AddOrderService(this IServiceCollection services,IConfiguration configuration)
  8. {
  9. // 需要添加验证的时候,这里就不能用Configure,而是AddOptions方法
  10. //services.Configure<OrderServiceOptions>(configuration);
  11. services.AddOptions<OrderServiceOptions>()
  12. // 使用configuration绑定
  13. .Configure(options => configuration.Bind(options))
  14. // 添加验证和提示
  15. .Validate(options => options.MaxOrderCount <= 10086, "MaxOrderCount不能超过10086");
  16. services.AddSingleton<IOrderService, OrderService>();
  17. return services;
  18. }
  19. }
  20. }

需要添加验证的时候,这里就不能用Configure,而是AddOptions方法。
利用configuration.Bind将配置绑定到OrderServiceOptions上,使用Validate添加验证和失败提示
将配置文件MaxOrderCount值修改为10087之后,执行代码:
image.png
image.png
引发异常,显示失败提示。

属性注入
这里我们切换为属性注入的方式

  1. using Microsoft.Extensions.Configuration;
  2. using OptionsDemo.Services;
  3. namespace Microsoft.Extensions.DependencyInjection
  4. {
  5. public static class OrderServiceExtensions
  6. {
  7. public static IServiceCollection AddOrderService(this IServiceCollection services,IConfiguration configuration)
  8. {
  9. // 需要添加验证的时候,这里就不能用Configure,而是AddOptions方法
  10. //services.Configure<OrderServiceOptions>(configuration);
  11. services.AddOptions<OrderServiceOptions>()
  12. // 使用configuration绑定
  13. .Configure(options => configuration.Bind(options))
  14. // 属性注入
  15. .ValidateDataAnnotations();
  16. services.AddSingleton<IOrderService, OrderService>();
  17. return services;
  18. }
  19. }
  20. }

使用ValidateDataAnnotations(),并且给我们的配置类OrderServiceOptions属性MaxOrderCount定义验证属性
这里使用Range的验证属性,定义最小值1最大值10086,我们配置文件的值10087

  1. public class OrderServiceOptions
  2. {
  3. [Range(1,10086)]
  4. public int MaxOrderCount { get; set; } = 200;
  5. }

执行程序:image.png

实现接口方式
我们首先定义验证类,验证类是需要实现IValidateOptions这个接口

  1. public class OrderServiceValidateOptions : IValidateOptions<OrderServiceOptions>
  2. {
  3. public ValidateOptionsResult Validate(string name, OrderServiceOptions options)
  4. {
  5. if (options.MaxOrderCount > 10086)
  6. {
  7. return ValidateOptionsResult.Fail("MaxOrderCount不能大于10086");
  8. }
  9. return ValidateOptionsResult.Success;
  10. }
  11. }
  1. using Microsoft.Extensions.Configuration;
  2. using Microsoft.Extensions.Options;
  3. using OptionsDemo.Services;
  4. namespace Microsoft.Extensions.DependencyInjection
  5. {
  6. public static class OrderServiceExtensions
  7. {
  8. public static IServiceCollection AddOrderService(this IServiceCollection services,IConfiguration configuration)
  9. {
  10. // 需要添加验证的时候,这里就不能用Configure,而是AddOptions方法
  11. //services.Configure<OrderServiceOptions>(configuration);
  12. services.AddOptions<OrderServiceOptions>()
  13. // 使用configuration绑定
  14. .Configure(options => configuration.Bind(options))
  15. // 接口
  16. .Services.AddSingleton<IValidateOptions<OrderServiceOptions>, OrderServiceValidateOptions>();
  17. services.AddSingleton<IOrderService, OrderService>();
  18. return services;
  19. }
  20. }
  21. }

这里是使用服务注册进去的
执行代码:image.png