2

我已经将我的 MVC 项目设置为使用 Fluent Validation 和 Castle Windsor,并且一切运行良好。我正在使用自定义验证器工厂,以考虑到我也在使用实体框架,并且必须考虑到包裹在我的 POCO 类周围的动态代理。这是我的 CastleWindsorValidatorFactory:

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;
}

当控制器操作是模型绑定的模型存在验证器时,一切都运行良好。如果该特定模型不存在验证器,则会收到 Windsor 无法解析该类型的错误。

但是,并非所有模型都需要验证器。我可以写一个空的,但这只是无用的代码。当我尝试解析验证器时,我是否应该抓住错误并忽略它?Castle 中是否有内置的东西可以帮助我解决这个问题?我该怎么办?

4

1 回答 1

0

我最终做的是在我的 ValidatorFactory 中捕获 ComponentNotFoundException 并像这样返回 null:

public class CastleWindsorValidatorFactory : ValidatorFactoryBase
{
    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 ) );

        }

        try
        {
            return ResolveType.Of( validatorType ) as IValidator;
        }
        catch( ComponentNotFoundException )
        {
            return null;
        }
    }
}

不完全确定这是最好的做法,但它似乎有效。

于 2010-08-13T14:30:40.653 回答