【问题标题】:Inject Dependencies into Validation Attribute using ASP.NET Core's WebAPI使用 ASP.NET Core Web API 将依赖项注入验证属性
【发布时间】:2017-01-30 09:03:03
【问题描述】:

我正在 ASP.NET Core WebAPI 中构建自定义验证属性。我需要在我的验证器中访问 IDataProtector 以及我用来访问数据库的另一个服务。我已经搜索过并且没有找到任何文档。 ActionFilters 可以选择使用 ServiceFilter,但似乎没有任何选项用于验证属性。有什么想法吗?

【问题讨论】:

  • 您不应将依赖项注入到hereherehere 所表达的属性中。

标签: asp.net-core asp.net-core-webapi


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这在某种程度上并不酷,它返回 400 HTTP 错误,而不是通过控制器 ModelState.IsValid(),我需要访问返回的布尔值,微软过去在需要时覆盖等等……
    【解决方案3】:

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

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

    【讨论】:

    • 因为 ValidationContext 实现了 IServiceProvider,添加 using Microsoft.Extensions.DependencyInjection 将添加其余有用的扩展,以允许 validationContext.GetService<MyDbContext>() 无需显式转换。
    • GetSerivce 从哪里获取依赖项?
    【解决方案4】:

    因为验证属性通常是在属性上定义的,所以它们不能通过构造函数接收引用。充其量,如果你真的深入模型绑定,可能需要定制一些东西来允许属性注入,但实际上我只是在 Validate 方法中获得对依赖解析器的引用,然后调用适当的方法。

    【讨论】:

    • 这个答案没有回答任何问题,这意味着不可能或机制模糊。
    猜你喜欢
    • 2018-03-24
    • 1970-01-01
    • 2017-10-22
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2016-09-27
    • 1970-01-01
    相关资源
    最近更新 更多