Azure 函数的流利验证

Posted

技术标签:

【中文标题】Azure 函数的流利验证【英文标题】:Fluent Validation For Azure Function 【发布时间】:2021-09-16 22:26:53 【问题描述】:

以下是我用来创建函数并尝试使用 Fluent Validation 验证模型的示例。它们是 2 个不同的功能 TestUser 和 AdminUser,我正在编写类来检查验证。他们还有其他有效的方法来为这些模型验证创建通用方法吗?

[FunctionName("TestUser")]
        public async Task<IActionResult> PostTestUser(
          [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "api/v1/Test")][RequestBodyType(typeof(TestUser)] TestUser testUser)
        
           TestUserValidator validator = new TestUserValidator();
           var validatedTestUser = validator.Validate(testUser);
           if (!validatedTestUser.IsValid)
            return BadRequestResponse(validatedTestUser);
        

public class TestUser 
            
        [JsonProperty("Id", Order = 1)]
        public Guid Id  get; set; 
        
        [JsonProperty("name", Order = 2)]
        public string Name  get; set; 
    

 public class TestUserValidator : AbstractValidator<TestUser>
           
        public TestUserValidator()
        
            RuleFor(_=> _.Id).Cascade(CascadeMode.Stop).NotNull().WithMessage("Required").CheckGuid();
            RuleFor(_=> _.Name).Cascade(CascadeMode.Stop).NotNull().WithMessage("NameRequired");
        
[FunctionName("AdminUser")]
        public async Task<IActionResult> PostAdminUser (
          [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "api/v1/admin")][RequestBodyType(typeof(AdminUser)] AdminUser adminUser )
        
           AdminUserValidator validator = new AdminUserValidator();
           var validatedAdminUser = validator.Validate(adminUser);
           if (!validatedAdminUser.IsValid)
            return BadRequestResponse(validatedAdminUser);
        

public class AdminUser 
            
        [JsonProperty("Id", Order = 1)]
        public Guid Id  get; set; 

        [JsonProperty("admin_name", Order = 2)]
        public string AdminName get; set; 
    

public class AdminUserValidator: AbstractValidator<AdminUser>
           
        public AdminUserValidator()
        
            RuleFor(_=> _.Id).Cascade(CascadeMode.Stop).NotNull().WithMessage(Resources.FieldRequired).CheckGuid();
            RuleFor(_=> _.AdminName).Cascade(CascadeMode.Stop).NotNull().WithMessage("AdminNameRequired");
        

【问题讨论】:

【参考方案1】:

Function Filters 功能最适合此功能,但仍处于预览阶段(不建议用于生产)。

最简单的方法是 leverage DI 并将验证器注入您的类,而不是为每次调用初始化一个。

您可以考虑简化代码的另一种方法是拥有一个扩展方法,您可以调用您的对象来验证它们。

这是一种设置方法

IValidateable

public interface IValidateable<T>

    AbstractValidator<T> Validator  get; 

验证扩展

public static class ValidationExtensions

    public static bool IsValid<T>(this IValidateable<T> obj)
    
        return obj.Validator.Validate((T)obj).IsValid;
    

模型 - Person 和 PersonValidator

public class Person : IValidateable<Person>

    [JsonProperty("Id", Order = 1)]
    public Guid Id  get; set; 

    [JsonProperty("name", Order = 2)]
    public string Name  get; set; 

    [JsonIgnore]
    public AbstractValidator<Person> Validator  get => PersonValidator.Instance; 


public class PersonValidator : AbstractValidator<Person>

    public static PersonValidator Instance = new PersonValidator();

    public PersonValidator()
    
        RuleFor(_ => _.Id).Cascade(CascadeMode.Stop).NotNull().WithMessage("Required");
        RuleFor(_ => _.Name).Cascade(CascadeMode.Stop).NotNull().WithMessage("NameRequired");
    

功能

public static class PersonFunctions

    [FunctionName("CreatePerson")]
    public static IActionResult CreatePerson(
        [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] Person person,
        ILogger log)
    
        if (!person.IsValid())
            return new BadRequestResult();

        return new OkResult();
    

【讨论】:

以上是关于Azure 函数的流利验证的主要内容,如果未能解决你的问题,请参考以下文章

Azure 函数 Http 触发器验证正文数据

具有 Azure AD 身份验证的 Azure 函数 - 允许的令牌受众不适用于 Microsoft Graph

Azure 函数错误 - “密钥功能不可用,因为为此函数应用启用了身份验证/授权。”

使用 ASP.NET 标识和 JWT 令牌的 Azure 函数身份验证

Python Azure 函数 - 使用 Key Vault 进行 MSI 身份验证

使用托管标识从 Azure Logic 应用向 Azure Function 进行身份验证