2

Fluent Validation と Castle Windsor を使用するように MVC プロジェクトをセットアップしましたが、すべてがうまく機能しています。カスタム Validator Factory を使用して、Entity Framework も使用していることを考慮しており、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 がその型を解決できないというエラーが表示されます。

ただし、すべてのモデルにバリデーターが必要なわけではありません。空のコードを書くことはできますが、それは役に立たないコードです。バリデーターを解決しようとしているときに、エラーをキャッチして無視する必要がありますか? これで私を助ける城に組み込まれているものはありますか? 私は何をすべきか?

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 に答える