2010-11-22 5 views
0

J'utilise Castle Windsor pour IoC. Il a travaillé très bien, mais tout d'un coup à chaque fois que je tente d'exécuter ma demande, il échoue lors d'un appel ResolveAll:Castle Windsor ResolveTout échoue avec une exception d'argument de type

var resolved = container.ResolveAll<IValidator>(); 

Il lance cette exception:

System.ArgumentException occurred 
    Message=The number of generic arguments provided doesn't equal the arity of the generic type definition. 
Parameter name: instantiation 
    Source=mscorlib 
    ParamName=instantiation 
    StackTrace: 
     at System.RuntimeType.MakeGenericType(Type[] instantiation) 
     at Castle.MicroKernel.Handlers.DefaultGenericHandler.ResolveCore(CreationContext context, Boolean requiresDecommission, Boolean instanceRequired) in c:\TeamCity\buildAgent\work\1ab5e0b25b145b19\src\Castle.Windsor\MicroKernel\Handlers\DefaultGenericHandler.cs:line 51 
    InnerException: 

La chose vraiment étrange est que ça a bien fonctionné jusqu'à aujourd'hui. Si je reviens à une version avant de commencer à faire cela, même jusqu'à la semaine dernière, j'ai toujours cette erreur. J'ai essayé de redémarrer, etc. Est-ce que quelqu'un a déjà vu ça?

EDIT:

Voici comment j'inscrire les IValidator:

private void registerFromAssembly(IWindsorContainer container, Assembly assembly) 
    { 
     container.Register(
      AllTypes.FromAssembly(assembly) 
       .BasedOn<IValidator>() 
     ); 
    } 

Voici comment j'enregistrer le service IPresenterResolver:

 container.Register(
      Component.For<IPresenterResolver>() 
       .ImplementedBy<CommandLineArgumentPresenterResolver>() 
     ); 

Je dois enlever tous les deux pour obtenir l'application à exécuter maintenant.

+0

Comme l'indique l'erreur, il existe une non-concordance de nombre de paramètres de type entre le type de service et le type d'implémentation. Pouvez-vous poster vos inscriptions? –

+0

Quelle version utilisez-vous? –

+0

@Krzysztof Kozmic: Castle.Core est 2.5.1.2121, Castle.Windsor est 2.5.1.2127. J'ai juste essayé le dernier 2.5.2 et il a le même problème. –

Répondre

2

J'ai dû télécharger le code source Castle Windsor pour pouvoir le déboguer à la source de l'échec. Il s'est avéré que j'inclus à tort certains services génériques de type base où je ne m'attendais qu'à des implémentations concrètes non génériques. Je devais changer mon code d'enregistrement à ce pour le faire fonctionner:

private void registerFromAssembly(IWindsorContainer container, 
     Assembly assembly) 
    { 
     container.Register(
      AllTypes.FromAssembly(assembly) 
       .BasedOn<IValidator>() 
        .Unless(type => type == typeof(FluentValidatorWrapper<>)) 
        .Unless(type => type == typeof(PassEverythingValidator<>)) 
     ); 
    } 

Dans ce cas FluentValidatorWrapper est un type générique de base que j'utilise pour construire des validateurs spécifiques de type et PassEverythingValidator est un type générique que ma logique de validation instancier manuellement quand il ne peut pas trouver un validateur spécifique au type. Ceux-ci n'auraient pas dû être inclus dans le conteneur.

J'ai noté sur la liste de diffusion de Castle Windsor que si les informations de type concret avaient été incluses dans l'exception, il aurait été plus facile de déboguer.

Questions connexes