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

时间:2016-09-21 23:21:51

标签: asp.net-mvc asp.net-web-api asp.net-core

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

4 个答案:

答案 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
}