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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top