1

我将 FluentValidation 与 MVC 3.0 一起使用;我已将其配置为与自定义验证器工厂和 IoC 容器(Unity)一起使用;

一切正常,我能够进行自定义验证并将它们与我的依赖项一起注入......但是发生了一件奇怪的事情:在我拥有 HtmlHelper 创建控件的所有强类型视图上(例如:Html.Editor),似乎MVC 正在尝试实例化验证器,这会导致 Unity 错误,因为在 Unity 中没有为这些模型映射验证器......在这些视图中,我没有任何检查来查看模型是否有效,也没有有任何自动模型绑定,那么我该如何阻止这种情况发生?我不想为每个模型创建空验证器并在 Unity 中注册它们只是为了摆脱这些错误..

这是我在 global.asax 中注册工厂的方法:

FluentValidationModelValidatorProvider.Configure(provider =>
{
    provider.ValidatorFactory = new UnityValidatorFactory(container);
});
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

这就是我注册自定义验证器的方式:

container.RegisterType<IValidator<XViewModel>, XViewModel>(
    new ContainerControlledLifetimeManager(),
    new InjectionConstructor(container.Resolve<ILocalizationService>(),
    container.Resolve<ISessionService>()));

对于 XView,一切正常,在我的操作方法中我做了一个 TryUpdateModel 并且验证工作正常;但是对于我不想进行任何验证的其他视图,MVC 仍然尝试为它们解析验证器并且通常会失败,因为在 Unity 中没有注册任何内容

您对如何解决此问题有任何想法吗?

谢谢,

乔治

编辑: 其他视图的错误是:当前类型 IValidator`1[...ViewModel] 是一个接口,无法构造。您是否缺少类型映射?

4

1 回答 1

0

当无法解析类型时,我修改了我的 UnityValidatorFactory 以返回 null;从性能的角度来看,我不知道这种解决方法有多好(因为引发了异常),但目前我没有更好的解决方案......

于 2012-07-12T07:42:23.327 回答