【问题标题】:Using FluentValidation with Castle Windsor and Entity Framework 4.0 (POCO) in MVC2在 MVC2 中将 FluentValidation 与 Castle Windsor 和 Entity Framework 4.0 (POCO) 一起使用
【发布时间】:2011-02-22 02:46:45
【问题描述】:

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

我正在尝试使以下事情协同工作:

  1. MVC2
  2. FluentValidation
  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= /p>

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

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

【问题讨论】:

  • 有什么方法可以检测 EF4 中的代理吗?
  • 你是怎么做到的——通过代理类型关闭 IValidator?
  • 框架对此负责。我将 Entity Framework 4 与 POCO 模板一起使用。 EF 在运行时使用代理类型包装真实类型,因此它可以执行诸如延迟加载之类的操作。因此,在您不知情的情况下,您实际上是在使用代理类型。当框架调用验证器工厂并将其传递给工厂时,框架就会发现这一点。当然,工厂不知道那是,所以你得到错误。正如其中一个答案所暗示的那样,我将致力于创建一个新的验证器工厂。如果我得到它的工作,我会发布。

标签: asp.net-mvc entity-framework castle-windsor poco fluentvalidation


【解决方案1】:

这是我的 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;
    }

【讨论】:

  • 感谢发布最终解决方案
【解决方案2】:

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

【讨论】:

  • 这是正确答案。我将把答案归功于这张海报,并将使用我使用的实际代码添加另一个答案。
猜你喜欢
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多