c# - Azure Function 的流畅验证

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

下面是我用来创建函数并尝试使用 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");
        }

最佳答案

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

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

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

这是一种设置方法

可验证

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();
    }
}

关于c# - Azure Function 的流畅验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68268001/

相关文章:

c# - 无法使用 Entity Framework 为 Oracle 创建数据库模型

c# - 如何在 ASP.NET Core 3.1 上运行的启用 OData 的 Web API 中添加 Swagger

angular - 在 ASP.NET Core 2.1 SPA 模板中找不到 webpack.config.js 或 webpack.config.vendor.js

c# - 使用 System.Text.Json 使用动态键查询或反序列化 json

c# - 沟通 Java 和 C#

javascript - JSON.parse 无法识别要解析的字符串中的\"(反斜杠和引号)

c# - IList<T> 与 IEnumerable<T>。 IList<T> 或 IEnumerable<T> 哪个更有效

c# - IViewLocalizer 返回错误的语言

c# - C# dotnet core 2.0 的 AOP,在方法体运行之前访问方法参数值

c# - .NET Core - 目录权限 Linux