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,但是问题依然存在:如何将依赖项注入到模型中.我们需要一个自定义模型binder来做到这一点吗?
另一个解决方案是在控制器中执行验证,其中依赖注入很容易.对我来说,这感觉很混乱.我想让模型在到达action方法的时候被验证.
另外我们有时候使用[RemoteAttribute]在客户端上执行这些验证.目前,这些方法通过使用静态Validator.TryValidateObject方法构建视图模型并将验证委托给模型.
您如何完成验证,需要注入的依赖关系来完成其工作,而不使用SL反模式?
解决方法
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验证一样:
> NotNull / NotEmpty
>匹配(正则表达式)
>包容性(范围)
>信用卡
>电子邮件
> EqualTo(交叉属性等价比较)
>长度
我从来没有使用数据注释来执行验证.当您需要处理一些更复杂的验证场景,您需要验证依赖属性甚至使用某些服务时,它们绝对没有用.我在前一句话中用斜体字复杂,因为我认为validating that one of the 2 properties是不是必须的,是一个非常复杂的验证场景,但是,只需检查您必须编写的基础设施垃圾数量,才能使用数据注释实现.看这个代码,你不再知道你正在验证什么.