Autofac无法解析已注册泛型服务问题求助
解决Autofac泛型CommandHandler未注册异常
我来帮你排查这个问题——你遇到的ComponentNotRegisteredException本质是泛型参数不匹配导致的,咱们一步步理清楚:
问题根源
先看你的调用逻辑:
var command = TypeHelper.GetCommandByDescriptor("LS"); // 返回的是ICommand类型 invoker.Dispatch(command);
Dispatch<T>方法的泛型参数T会被编译器推断为ICommand,所以执行container.Resolve<ICommandHandler<T>>()时,Autofac会去寻找ICommandHandler<ICommand>的注册。但你实际注册的是针对具体命令类型的Handler(比如ICommandHandler<LsCommand>),两者完全不匹配,自然找不到对应的组件。
修复方案
你需要根据命令的实际运行时类型来解析对应的Handler,而不是依赖编译时的ICommand类型。修改Invoker的Dispatch方法即可:
public class Invoker : IInvoker { private readonly IContainer container; public Invoker(IContainer container) { this.container = container; } // 把泛型方法改为接收ICommand参数,避免编译时类型推断错误 public void Dispatch(ICommand command) { if (command == null) return; // 根据命令的实际类型构建对应的Handler类型 var handlerType = typeof(ICommandHandler<>).MakeGenericType(command.GetType()); // 解析Handler并执行(用dynamic跳过编译时类型检查) dynamic handler = container.Resolve(handlerType); handler.Execute(command); } }
额外验证点
确保你的
RegisterTypes扩展方法逻辑正确:public static IContainer RegisterTypes(this ContainerBuilder builder) { builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()) .AsClosedTypesOf(typeof(ICommandHandler<>)) // 正确注册所有闭包泛型Handler .AsImplementedInterfaces(); return builder.Build(); }这行代码会自动扫描程序集中所有实现了
ICommandHandler<T>(T为具体命令)的类,并注册为对应的ICommandHandler<具体命令>服务,逻辑是没问题的。确认
GetCommandByDescriptor返回的是具体的命令实例(比如LsCommand),而不是动态代理的ICommand对象——如果是后者,可能需要调整类型获取逻辑。
这样修改后,Autofac就能正确找到对应具体命令的Handler,不会再抛出未注册异常了。
内容的提问来源于stack exchange,提问作者behzad chizari
相关产品推荐
相关产品推荐

