2

这不是一个非常简单的问题,但希望有人遇到过。

我试图让以下事情一起工作:

  1. MVC2
  2. 流利验证
  3. 实体框架 4.0 (POCO)
  4. 温莎城堡

我几乎让一切正常。我已经实现了 Castle Windsor,并与作为 MVCContrib 一部分的 WindsorControllerFactory 提供的控制器一起工作。如本文所述,我还让 Castle 提供 FluentValidation 验证器:http: //www.jeremyskinner.co.uk/2010/02/22/using-fluentvalidation-with-an-ioc-container/

当我尝试在视图上使用 Html.EditorForModel 或 EditorFor 时,我的问题就出现了。当我尝试这样做时,我收到此错误消息:

没有组件支持服务 FluentValidation.IValidator`1[[System.Data.Entity.DynamicProxies.State_71C51A42554BA6C3CF05105DA05435AD209602C217FC4C34CA52ACEA2B06B99B, EntityFrameworkDynamicProxies-BrindleyInsurance.BusinessObjects, Version=1.0.0.0, Culture=neutral]]

这是由于在 Entity Framework 4.0 上使用了 POCO 生成。在运行时,生成的类被动态代理包装,因此可以进行跟踪和延迟加载。显然,当使用 EditorForModel 或 EditorFor 时,它会尝试要求 Windsor 为动态代理类型而不是底层真实类型创建验证器。

有谁知道我能做些什么来解决这个问题?

4

2 回答 2

3

我建议您编写自定义 FluentValidatorFactory,它将为类代理返回正确的验证器类。

于 2010-05-21T03:55:13.497 回答
3

这是我的 ValidatorFactory 的 CreateInstance 方法。如果您看到更好的方法,请发表评论。

    public override IValidator CreateInstance( Type validatorType)
    {
        if( validatorType.GetGenericArguments()[0].Namespace.Contains( "DynamicProxies" ) )
        {
            validatorType = Type.GetType( String.Format( "{0}.{1}[[{2}]], {3}", validatorType.Namespace, validatorType.Name, validatorType.GetGenericArguments()[0].BaseType.AssemblyQualifiedName, validatorType.Assembly.FullName ) );

        }

        return ResolveType.Of( validatorType ) as IValidator;
    }
于 2010-05-21T21:54:58.790 回答