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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top