2010-11-22 26 views
0

我正在使用Castle Windsor作爲IoC。它一直工作很好,但突然我嘗試運行我的應用程序每一次,它ResolveAll通話過程中失敗:Castle Windsor ResolveAll類型參數異常失敗

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

它拋出該異常:

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: 

真正奇怪的是直到今天它一直在努力。如果我在開始執行此操作之前回滾到某個版本,即使回到上個星期,我仍然會收到此錯誤。我試過重新啓動等。有沒有人看過這個?

編輯

這裏是我如何註冊IValidator的:

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

這裏是我如何註冊IPresenterResolver服務:

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

我不得不刪除這兩個來讓應用程序現在運行。

+0

正如錯誤所述,服務類型和實現類型之間存在類型參數計數不匹配。你可以發佈你的註冊? – 2010-11-23 00:28:31

回答

2

我不得不下載Castle Windsor源代碼,以便在出現故障時調試它。事實證明,我錯誤地包含了一些泛型基類型服務,我只希望非泛型具體實現。我不得不改變我的註冊代碼,這使得它的工作:

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是一個泛型類型,我驗證邏輯手動實例當它找不到類型特定的驗證器時。這些不應該包含在容器中。

我在Castle Windsor的郵件列表上做了一個記錄,如果具體的類型信息已經包含在例外中,那麼調試起來會更容易。