我在Asp.Net Core Web Api中构建自定义验证属性。我需要在验证器中访问IDataProtector以及我用来访问数据库的其他服务。我已经搜索过,并且没有找到任何相关文档。 ActionFilters可以选择使用ServiceFilter,但似乎没有任何验证属性选项。有什么想法吗?
答案 0 :(得分:8)
使用ValidationContext的GetService()方法获取数据库。 即。
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
MyDbContext db = (MyDbContext) validationContext.GetService(typeof(MyDbContext));
//...
}
答案 1 :(得分:2)
我们有一个类似的要求,即需要将其他数据传递到属性以提供足够的上下文来执行验证。
我们想出了一种构建可以传递给属性的上下文对象的方法。我在here上写过博客。
我们正在使用异步api执行数据访问,这带来了一些其他挑战。
答案 2 :(得分:1)
由于验证属性通常在属性上定义,因此它们无法通过构造函数接收引用。最好如果你真的深入到模型绑定中,可能需要自定义以允许属性注入,但实际上我只是在Validate方法中获得对依赖项解析器的引用,并调用适当的方法。
答案 3 :(得分:0)
您可以覆盖IsValid方法并使用validationContext来解析依赖关系:
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var service = (IExternalService) validationContext.GetService(typeof(IExternalService));
// use service
}