Виндзорский замок и беглая проверка в качестве валидатора MVC
-
26-09-2019 - |
Вопрос
Я настроил свой проект 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;
}
}
}
Не совсем уверен, что это лучшее, что можно сделать, но, похоже, это работает.