【发布时间】:2017-01-30 09:03:03
【问题描述】:
我正在 ASP.NET Core WebAPI 中构建自定义验证属性。我需要在我的验证器中访问 IDataProtector 以及我用来访问数据库的另一个服务。我已经搜索过并且没有找到任何文档。 ActionFilters 可以选择使用 ServiceFilter,但似乎没有任何选项用于验证属性。有什么想法吗?
【问题讨论】:
标签: asp.net-core asp.net-core-webapi
我正在 ASP.NET Core WebAPI 中构建自定义验证属性。我需要在我的验证器中访问 IDataProtector 以及我用来访问数据库的另一个服务。我已经搜索过并且没有找到任何文档。 ActionFilters 可以选择使用 ServiceFilter,但似乎没有任何选项用于验证属性。有什么想法吗?
【问题讨论】:
标签: asp.net-core asp.net-core-webapi
我们有类似的要求,需要将额外的数据传递给属性以提供足够的上下文来执行验证。
我们想出了一种方法来构建可以传递给属性的上下文对象。我在博客上写了here。
我们正在使用异步 API 来执行数据访问,这带来了一些额外的挑战。
【讨论】:
您可以覆盖 IsValid 方法并使用 validationContext 来解决依赖关系:
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var service = (IExternalService) validationContext.GetService(typeof(IExternalService));
// use service
}
【讨论】:
使用 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>() 无需显式转换。
因为验证属性通常是在属性上定义的,所以它们不能通过构造函数接收引用。充其量,如果你真的深入模型绑定,可能需要定制一些东西来允许属性注入,但实际上我只是在 Validate 方法中获得对依赖解析器的引用,然后调用适当的方法。
【讨论】: