Замок Виндзор ResolveAll завершается ошибкой с исключением аргумента типа - PullRequest
0 голосов
/ 22 ноября 2010

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

Мне нужно удалить оба из них, чтобы приложение теперь запустилось.

1 Ответ

2 голосов
/ 23 ноября 2010

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

...