17 | 为选项数据添加验证:避免错误配置的应用接收用户流量

三种验证方法

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

示例

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

using Microsoft.Extensions.Configuration;
using OptionsDemo.Services;

namespace Microsoft.Extensions.DependencyInjection
{
    public static class OrderServiceExtensions
    {
        public static IServiceCollection AddOrderService(this IServiceCollection services,IConfiguration configuration)
        {
            // 需要添加验证的时候,这里就不能用Configure,而是AddOptions方法
            //services.Configure<OrderServiceOptions>(configuration);

            services.AddOptions<OrderServiceOptions>()
                // 使用configuration绑定
                .Configure(options => configuration.Bind(options))
                // 添加验证和提示
                .Validate(options => options.MaxOrderCount <= 10086, "MaxOrderCount不能超过10086");

            services.AddSingleton<IOrderService, OrderService>();
            return services;
        }
    }
}

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

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

using Microsoft.Extensions.Configuration;
using OptionsDemo.Services;

namespace Microsoft.Extensions.DependencyInjection
{
    public static class OrderServiceExtensions
    {
        public static IServiceCollection AddOrderService(this IServiceCollection services,IConfiguration configuration)
        {
            // 需要添加验证的时候,这里就不能用Configure,而是AddOptions方法
            //services.Configure<OrderServiceOptions>(configuration);

            services.AddOptions<OrderServiceOptions>()
                // 使用configuration绑定
                .Configure(options => configuration.Bind(options))
                // 属性注入
                .ValidateDataAnnotations();

            services.AddSingleton<IOrderService, OrderService>();
            return services;
        }
    }
}

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

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

执行程序:image.png

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

public class OrderServiceValidateOptions : IValidateOptions<OrderServiceOptions>
{
	public ValidateOptionsResult Validate(string name, OrderServiceOptions options)
    {
    	if (options.MaxOrderCount > 10086)
         {
			return ValidateOptionsResult.Fail("MaxOrderCount不能大于10086");
         }
         return ValidateOptionsResult.Success;
	}
}
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;
using OptionsDemo.Services;

namespace Microsoft.Extensions.DependencyInjection
{
    public static class OrderServiceExtensions
    {
        public static IServiceCollection AddOrderService(this IServiceCollection services,IConfiguration configuration)
        {
            // 需要添加验证的时候,这里就不能用Configure,而是AddOptions方法
            //services.Configure<OrderServiceOptions>(configuration);

            services.AddOptions<OrderServiceOptions>()
                // 使用configuration绑定
                .Configure(options => configuration.Bind(options))
                // 接口
                .Services.AddSingleton<IValidateOptions<OrderServiceOptions>, OrderServiceValidateOptions>();

            services.AddSingleton<IOrderService, OrderService>();
            return services;
        }
    }
}

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

推荐这些文章:

17、【SparkSQL】org.apache.hadoop.security.HadoopKerberosName.setRuleMechanism异常

背景
当我在使用IDEA本地连接服务器spark服务时,虽然拷贝了hive-site.xml,提供了相应的依赖,仍然报错:org.apache.hadoop.security.HadoopKerberosName.setRuleMechanism
依赖如下:
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>...

15 | 选项框架:服务组件集成配置的最佳实践

特性

支持单例模式读取配置
支持快照
支持配置变更通知
支持运行时动态修改选项值

设计原则

接口分离原则(LSP),我们的类不应该依赖它不适用的配置
关注点分离(SOC),不同组件、服务、类之间的配置不应相互依赖或耦合

建议

为我们的服务设计XXXOptions
使用IOptions<XXXOptions>、IOptionsSnapshot<XXXOptions>、IOptionsMonitor<XXXOptions>作为服务构造函数的参数

示例
新建Web应用程序👉命名OptionsDemo👉模板选择API👉新建Services文件夹👉新建O...

16 | 选项数据热更新:让服务感知配置的变化

选项框架关键类型

IOptionsMonitor
IOptionsSnapshot

场景

范围作用域类型使用IOptionsSnapshot
单例服务使用IOptionsMonitor

通过代码更新选项

IPostConfigureOptions

示例
延续使用上一节代码,稍微做些特殊处理将OrderServce服务从Singleton模式修改为Scope模式services.AddSingleton<IOrderService, OrderService>() => services.AddScoped<IOrderService, OrderServi...

spring 注解错误

配置注解后运行提示
Unsupported class file major version 61
解决:在pom中修改
将<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>17</source> <target>17</target> </config...

jquery添加选项到dropdownlist取值的错误

问题
我是这样添加的,city是个数组$("<OPTION vlaue="+"\""+ city[0]+"\"" + ">" + city[1] + "</OPTION>").appendTo("#<%=ddlCity.ClientID %>");我用这个方法取$("#<%=ddlCity.ClientID %> option:selected").val()怎么取到选中的值总是city[1],而不是 city[0]

最佳回答
$("#<%=ddlCity.ClientID %>...

怎么样可以在调用方法时验证?

问题
<P>如:有一方法:</P>
<P>public function Add(b as User) as Boolean</P>
<P>....</P>
<P>end function</P>
<P>怎么样实现在调用:add(user)时检查用户的权限,如无权则提示。。。有权限则继续进行?</P>
<P>就好像:</P>
<P>&lt;checkPower(ADMIN.ADD))&gt...

Failed to bind properties under 'mybatis.configuration.mapped-statements[0]

原因是mybatis版本不兼容导致

在springcloud项目版本设置
当springboot为2.1.5.RELEASE

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/>
...

解决:Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

yml或者properties文件没有被扫描到,需要在pom文件中<build></build>添加如下.来保证文件都能正常被扫描到并且加载成功.

<!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉。 -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.yml</...

idea maven打包错误 程序包common不存在

背景:父级项目Root, springboot项目A,common模块B,业务模块C
问题:刚开始打包root,提示程序包common不存在
尝试:先install B,再install C, 最后package A,无效。
解决方案:将root中的pom文件中关于springboot自带的maven插件注释掉

<build>
<!-- <plugins>-->
<!-- <plugin>-->
<!--&lt;!&ndash; <g...

配置信息记录

SpringMVC中:
pom.xml附加依赖参数:

<packaging>war</packaging>

<dependencies>
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<ve...

文章标题:17 | 为选项数据添加验证:避免错误配置的应用接收用户流量
文章链接:https://www.dianjilingqu.com/50989.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>