我正在使用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>()
);
我必须删除这两个才能让应用程序立即运行。
答案 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邮件列表上做了一个注释,如果具体的类型信息已包含在异常中,那么调试会更容易。