Castle Windsor ResolveAll因类型参数异常而失败

时间:2010-11-22 20:58:12

标签: castle-windsor ioc-container

我正在使用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: 

真奇怪的是,它一直很好用,直到今天。如果我在开始这样做之前回滚到版本,即使回到上周,我仍然会收到此错误。我试过重启等等。有没有人见过这个?

修改

以下是我注册IValidator的方法:

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

以下是我注册IPresenterResolver服务的方式:

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

我必须删除这两个才能让应用程序立即运行。

1 个答案:

答案 0 :(得分: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邮件列表上做了一个注释,如果具体的类型信息已包含在异常中,那么调试会更容易。