Виндзорский замок и свободная проверка как валидатор MVC - PullRequest
2 голосов
/ 06 августа 2010

Я настроил свой проект MVC для использования Fluent Validation и Castle Windsor, и все работает замечательно. Я использую собственную фабрику 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;
}

Все работает хорошо, когда существует валидатор для модели, в которой действие контроллера является привязкой модели. Если для этой конкретной модели не существует валидатора, я получаю сообщение об ошибке, что Виндзор не может разрешить этот тип.

Но не всем моделям нужен валидатор. Я могу написать пустой, но это просто бесполезный код. Должен ли я просто поймать ошибку и игнорировать ее, когда пытаюсь разрешить валидатор? Есть ли что-то встроенное в замок, что поможет мне в этом? Что мне делать?

1 Ответ

0 голосов
/ 13 августа 2010

В результате я перехватил исключение ComponentNotFoundException внутри моего ValidatorFactory и возвратил ноль следующим образом:

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

Не совсем уверен, что это лучше всего сделать, но, похоже, это работает.

...