【问题标题】:Fluent Validation For Azure FunctionAzure 函数的流利验证
【发布时间】: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");
        }

【问题讨论】:

    标签: c# asp.net-core .net-core azure-functions fluentvalidation


    【解决方案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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 2011-10-12
      • 2019-07-13
      • 1970-01-01
      • 2020-08-10
      相关资源
      最近更新 更多