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 AD 身份验证的 Azure 函数 - 允许的令牌受众不适用于 Microsoft Graph
Azure 函数错误 - “密钥功能不可用,因为为此函数应用启用了身份验证/授权。”
使用 ASP.NET 标识和 JWT 令牌的 Azure 函数身份验证