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