Castle Windsor e validação fluente como validador de MVC
-
26-09-2019 - |
Pergunta
Eu configurei meu projeto MVC para usar a validação fluente e o castelo Windsor e tudo está funcionando maravilhosamente. Estou usando uma fábrica de validador personalizada para levar em consideração que também estou usando o Entity Framework e tenho que explicar os proxies dinâmicos que são enrolados nas minhas classes POCO. Aqui está o meu 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;
}
Tudo está funcionando bem quando existe um validador para o modelo que a ação do controlador é a ligação do modelo. Se não existir validador para esse modelo específico, recebo um erro que o Windsor não pode resolver esse tipo.
Mas nem todos os modelos precisam de um validador. Eu posso escrever um vazio, mas isso é apenas um código inútil. Devo apenas pegar o erro e ignorá -lo quando estou tentando resolver um validador? Existe algo embutido no castelo que me ajudará com isso? O que devo fazer?
Solução
O que acabei fazendo com isso foi pegar a componenteNotFoundException dentro do meu validatorFactory e retornando nulo assim:
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;
}
}
}
Não tenho certeza de que é a melhor coisa a fazer, mas parece funcionar.