如何在.NET MVC3中注入用于验证的依赖项?

dan*_*wig 14 validation dependency-injection asp.net-mvc-3

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

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

我知道这是:(作为一个反模式,我们想使用更正确的方法.我们使用统一,我读了这篇文章,说使用建立方法.但是接受的答案中的链接说文档已经过时(退役内容).

解决方案不需要使用验证属性,我想它可以使用IValidatableObject,但问题仍然存在:如何将依赖项注入模型.我们需要一个自定义模型绑定器吗?

另一种解决方案是在控制器中执行验证,其中依赖注入很容易.对我来说,这感觉很混乱.我希望模型在到达action方法时得到验证.

此外,我们有时使用[RemoteAttribute]在客户端上执行某些验证.目前,这些方法通过使用静态Validator.TryValidateObject方法构造视图模型并将验证委托给模型.

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

Dar*_*rov 12

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

我使用FluentValidation.NET在我的应用程序中执行验证.它允许我将依赖项注入我的验证器.它与ASP.NET MVC有很好的集成.它还支持标准规则的自动客户端验证,就像使用jquery unobtrusive验证的数据注释一样:

  • NOTNULL/NotEmpty
  • 比赛(正则表达式)
  • InclusiveBetween(范围)
  • 信用卡
  • 电子邮件
  • EqualTo(跨财产平等比较)
  • 长度

我从未使用数据注释来执行验证.当您需要处理一些需要验证依赖属性甚至使用某些服务的更复杂的验证方案时,它们绝对没用.我在上一句中用斜体字表示复杂因为,我认为不需要验证两个属性中的一个是否是一个非常复杂的验证方案,然而,只需检查为了实现而必须编写的基础设施废弃量它使用数据注释.看看这段代码,你不再知道你在验证什么.