Castello di Windsor e Fluent convalida come MVC Validator
-
26-09-2019 - |
Domanda
Ho installato il mio progetto MVC di utilizzare Fluent Validazione e Castello di Windsor e tutto funziona meravigliosamente. Sto usando una consuetudine Validator fabbrica di tener conto che sto anche utilizzando Entity Framework e devono conto per i proxy dinamici che vengono avvolti intorno mie classi POCO. Ecco la mia 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;
}
Tutto funziona bene quando esiste un validatore per il modello che l'azione del controller è vincolante modello. Se non esiste alcun validatore per quel particolare modello, allora ottengo un errore che Windsor non può risolvere quel tipo.
Ma, non tutti i modelli hanno bisogno di un validatore. Posso scrivere uno vuoto, ma che è solo codice inutile. Devo solo prendere l'errore e ignorarlo quando sto cercando di risolvere un validatore? C'è qualcosa integrato nel Castello che mi aiuterà con questo? Cosa devo fare?
Soluzione
Quello che ho finito per fare questo è stato quello di prendere il ComponentNotFoundException dentro la mia ValidatorFactory e nulla di tornare in questo modo:
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;
}
}
}
Non del tutto sicuro che sia la cosa migliore da fare, ma sembra funzionare.