将依赖项注入到验证属性Web Api Asp.Net Core中

Mad*_*noy 3 asp.net-mvc asp.net-web-api asp.net-core

我正在Asp.Net Core Web Api中构建自定义验证属性。我需要访问验证器中的IDataProtector和用于访问数据库的其他服务。我已经搜索过,并且没有找到有关此内容的任何文档。ActionFilters可以选择使用ServiceFilter,但是Validation Attribute似乎没有任何选择。有任何想法吗?

小智 8

使用ValidationContext的GetService()方法获取数据库。即

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
  MyDbContext db = (MyDbContext) validationContext.GetService(typeof(MyDbContext));
  //...
}
Run Code Online (Sandbox Code Playgroud)

  • 并且由于“ValidationContext”实现了“IServiceProvider”,因此添加“using Microsoft.Extensions.DependencyInjection”将添加其余有用的扩展,以允许“validationContext.GetService<MyDbContext>()”而无需显式转换。 (6认同)

ali*_*ian 5

您可以重写 IsValid 方法并使用validationContext 来解决依赖关系:

protected override ValidationResult IsValid(object value, ValidationContext validationContext)  
{
    var service = (IExternalService) validationContext.GetService(typeof(IExternalService));
    // use service
}
Run Code Online (Sandbox Code Playgroud)


Bri*_*ins 0

由于验证属性通常是在属性上定义的,因此它们无法通过构造函数接收引用。最好的情况是,如果您确实深入模型绑定,则可能需要自定义一些内容以允许属性注入,但最实际的是,我只是在 Validate 方法中获取对依赖项解析器的引用,并调用适当的方法。