我正在ASP中构建一个自定义验证属性。. NET Core WebAPI。我需要在我的验证器和我用来访问数据库的另一个服务中访问IDataProtector。我已经搜索过了,没有找到任何关于这个的文档。ActionFilters有使用ServiceFilter的选项,但似乎没有任何验证属性的选项。什么好主意吗?
使用ValidationContext的GetService()方法来获取数据库。例如
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
MyDbContext db = (MyDbContext) validationContext.GetService(typeof(MyDbContext));
//...
}
你可以重写IsValid方法并使用validationContext来解决依赖:
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var service = (IExternalService) validationContext.GetService(typeof(IExternalService));
// use service
}
我们有一个类似的需求,需要将额外的数据传递给一个属性,以便为它提供足够的上下文来执行验证。
我们提出了一种方法来构建一个可以传递给属性的上下文对象。我在这里写了一篇博文。
我们正在使用异步api来执行数据访问,这带来了一些额外的挑战。
因为验证属性通常是在属性上定义的,所以它们不能通过构造函数接收引用。最好的情况是,如果您真的深入研究了模型绑定,可能会有一些东西可以定制以允许属性注入,但实际上,我只是在Validate方法中获得对依赖解析器的引用,并调用适当的方法。