Виндзорский замок и беглая проверка в качестве валидатора MVC

StackOverflow https://stackoverflow.com/questions/3426818

Вопрос

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

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

Это было полезно?

Решение

То, что я в конечном итоге сделал с этим, заключалось в том, чтобы перехватить ComponentNotFoundException внутри моего ValidatorFactory и вернуть 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;
        }
    }
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top