使用 ASP.NET Core 的 WebAPI 将依赖项注入验证属性

Inject Dependencies into Validation Attribute using ASP.NET Core's WebAPI

我正在 ASP.NET 核心 WebAPI 中构建自定义验证属性。我需要访问我的验证程序中的 IDataProtector 和我用来访问数据库的另一项服务。我已经搜索过,但无法找到这方面的任何文档。 ActionFilters 可以选择使用 ServiceFilter,但似乎没有任何 Validation Attribute 选项。有什么想法吗?

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

使用 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
}

我们有一个类似的要求,需要将额外的数据传递给属性以提供足够的上下文来执行验证。

我们想出了一种方法来构建可以传递给属性的上下文对象。我写了关于它的博客 here

我们正在使用异步 api 来执行数据访问,这带来了一些额外的挑战。