asp.net-mvc-3 - 如何在.NET MVC3中注入(inject)用于验证的依赖项?

标签 asp.net-mvc-3 validation dependency-injection

我们有很多验证方法需要访问存储库/数据库才能完成工作。到目前为止,我们一直在使用服务定位器模式(尽管很少)在自定义 ValidationAttributes 中完成此任务:

public override bool IsValid(object value)
{
    // use custom service locator in our app's infrastructure
    var repos = DependencyInjector.Current.GetService<IXyzRepository>();
    ...
}

我知道这是:(作为反模式,我们想使用更正确的方法。我们使用统一,我读了 this post that says to use a build-up method 。但是 the link in the accepted answer 说文档已经过时(已退休)内容)。

该解决方案不需要使用验证属性,我想它可以使用 IValidatableObject,但是问题仍然存在:如何将依赖项注入(inject)模型中。我们需要自定义模型绑定(bind)器来执行此操作吗?

另一种解决方案是在 Controller 中执行验证,其中依赖项注入(inject)很容易。对我来说,这感觉很困惑。我希望模型在到达操作方法时得到验证。

此外,我们有时会使用 [RemoteAttribute] 在客户端上执行其中一些验证。目前,这些方法构造 View 模型并使用静态 Validator.TryValidateObject 方法将验证委托(delegate)给模型。

您如何在不使用 SL 反模式的情况下完成需要注入(inject)依赖项才能完成工作的验证?

最佳答案

How have you accomplished validation that requires an injected dependency to do its work, without using the SL anti-pattern?

我使用FluentValidation.NET在我的应用程序中执行验证。它允许我inject dependencies进入我的验证器。它有一个非常好的integration with ASP.NET MVC 。它还支持标准规则的自动客户端验证,就像使用 jquery unobtrusive validate 进行数据注释一样:

  • 非空/非空
  • 匹配(正则表达式)
  • InclusiveBetween(范围)
  • 信用卡
  • 电子邮件
  • EqualTo(跨属性相等比较)
  • 长度

我从未使用数据注释来执行验证。当您需要处理一些更复杂的验证场景(需要验证依赖属性甚至使用某些服务)时,它们绝对没有用处。我在前一句中将“complex”用斜体字表示,因为我不认为 validating that one of the 2 properties所需要的是一个非常复杂的验证场景,但是,只需检查您必须编写的基础设施垃圾量,以便使用数据注释来实现它。看着这段代码,您不再知道您正在验证什么。

关于asp.net-mvc-3 - 如何在.NET MVC3中注入(inject)用于验证的依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8818775/

相关文章:

asp.net-mvc - 'Html.Validate' 和 'Html.ValidateFor' 之间的区别

asp.net-mvc-3 - 您可以在 ASP.net MVC3 中使用嵌套 View 模型吗?

java - 谷歌指南 2.0

c# - 运行时的 Autofac 绑定(bind)

html - 如何检查浏览器是否支持css3圆 Angular 和svg

Angularjs ui 网格过滤器按钮显示为中文字体

forms - 使用一组规则的 Codeigniter 表单验证

r - R 函数的半自动参数验证

javascript - 使用 validator.addMethod 进行 js 验证

c# - 未授予所需的权限。必须至少授予其中一项权限 : Users