2010-11-22 17 views
0

IoCのCastle Windsorを使用しています。それは素晴らしい仕事をしていますが、私は自分のアプリケーションを実行しようと突然たびのすべてが、それはResolveAll通話中に失敗した:Castle Windsor ResolveAllが型引数の例外で失敗する

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: 

本当に奇妙なことがある:それは、この例外をスロー

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

それは今日まで偉大な作業をしてきたことだ。先週に戻っても、これをやってみる前にバージョンに戻っても、私はまだこのエラーが出ます。私は再起動などを試みました誰もこれを見たことがありますか?

EDIT

は、ここで私はIValidatorのものを登録しています方法は次のとおりです。

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

は、ここで私はIPresenterResolverサービスを登録しています方法は次のとおりです。

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

私は削除する必要がこれらの両方を使用して、今すぐアプリケーションを実行します。

+0

エラーが言うように、サービスタイプと実装タイプ間の型パラメータ数の不一致があります。あなたは登録を投稿できますか? –

+0

あなたはどのバージョンを使用しています –

+0

@ Krzysztof Kozmic:Castle.Coreは2.5.1.2121、Castle.Windsorは2.5.1.2127です。私はちょうど最新の2.5.2を試しました、そして、それは同じ問題を抱えています。 –

答えて

2

私は失敗の元でそれをデバッグすることができるように城ウィンザーのソースコードをダウンロードする必要がありました。私が非ジェネリックな具体的な実装だけを期待していたジェネリックベースタイプのサービスを間違って含むことが判明しました。この場合、

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

FluentValidatorWrapper私はタイプ固有のバリデータを構築するために使用する一般的な基本型であるとPassEverythingValidatorは私の検証ロジックを手動でインスタンス化する一般的なタイプです:私はそれを動作させるためにこれに私の登録コードを変更する必要がありました型固有のバリデータが見つからない場合に発生します。これらはコンテナに含まれていてはなりません。

私はコンクリートの型情報が例外に含まれていたならば、それはデバッグが容易だっただろうという城ウィンザーメーリングリストで書き留めました。

関連する問題