2010-11-22 2 views
0

Я использую Castle Windsor для IoC. Это работает замечательно, но вдруг каждый раз, когда я пытаюсь запустить мое приложение, оно не во время ResolveAll вызова:Замок 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: 

Действительно странно это что он работает до сегодняшнего дня. Если я вернусь к версии до того, как она начнет это делать, даже на прошлой неделе, я все равно получаю эту ошибку. Я попытался перезагрузить и т. Д. Кто-нибудь видел это раньше?

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

Как говорится в ошибке, существует несоответствие числа параметров типа между типом службы и типом реализации. Можете ли вы разместить свою регистрацию? – 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, который, если бы информация о конкретном типе была включена в исключение, было бы легче отладить.

Смежные вопросы