.NET 7应用Autofac依赖注入异常:无法解析IMyModule参数
.NET 7应用Autofac依赖注入解析失败
异常信息
Autofac.Core.DependencyResolutionException: 激活MyApp.Modules.MyModule.Application.MyModule.UpdateCommand.UpdateCommandHandler时引发异常。 ---> Autofac.Core.DependencyResolutionException: 使用'MyApp.Modules.MyModule.Infrastructure.Configuration.AllConstructorFinder'在类型'MyApp.Modules.MyModule.Application.MyModule.UpdateCommand.UpdateCommandHandler'上找到的所有构造函数均无法使用可用服务和参数调用: 无法解析构造函数'Void .ctor(Serilog.ILogger, MyApp.Modules.MyModule.Application.Contracts.IMyModule)'的参数'MyApp.Modules.MyModule.Application.Contracts.IMyModule myModule'。
相关代码文件
UpdateCommandHandler.cs(问题出现位置)
public class UpdateCommandHandler: ICommandHandler<UpdateCommand> { private readonly IMyModule _myModule; private readonly ILogger _logger; public UpdateCommandHandler(ILogger logger, IMyModule myModule) { _myModule = myModule; _logger = logger; } public async Task<Unit> Handle(UpdateCommand request, CancellationToken cancellationToken) { var foo = await _myModule.ExecuteQueryAsync(new SampleQuery()); return Unit.Value; } }
Program.cs(容器配置代码)
... var builder = WebApplication.CreateBuilder(args); builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); builder.Host.ConfigureContainer<ContainerBuilder>(b => b.RegisterModule(new AutofacModules())); ...
AutofacModules.cs(依赖注册代码)
public class AutofacModules: Autofac.Module { protected override void Load(ContainerBuilder builder) { builder.RegisterType<MyModule>().As<IMyModule>().InstancePerLifetimeScope(); } }
IMyModule.cs(接口定义)
public interface IMyModule { Task ExecuteCommandAsync(ICommand command); Task<TResult> ExecuteQueryAsync<TResult>(IQuery<TResult> query); }
MyModule.cs(接口实现类)
public class MyModule: IMyModule { public async Task ExecuteCommandAsync(ICommand command) { await CommandsExecutor.Execute(command); } public Task<TResult> ExecuteQueryAsync<TResult>(IQuery<TResult> query) { var scope = MyCompositionRoot.BeginLifetimeScope(); var mediator = scope.Resolve<IMediator>(); return mediator.Send(query); } }
AllConstructorFinder.cs(自定义构造函数查找器)
internal class AllConstructorFinder : IConstructorFinder { private static readonly ConcurrentDictionary<Type, ConstructorInfo[]> Cache = new(); public ConstructorInfo[] FindConstructors(Type targetType) { var result = Cache.GetOrAdd(targetType, t => t.GetTypeInfo().DeclaredConstructors.ToArray()); return result.Length > 0 ? result : throw new NoConstructorsFoundException(targetType); } }
前置排查说明
已查阅同类依赖注入解析失败问题,确认已按常规方式注册IMyModule与MyModule的映射,但问题仍存在。
排查与解决方向
1. 严格校验命名空间匹配
异常中明确无法解析的是MyApp.Modules.MyModule.Application.Contracts.IMyModule,先确认注册代码中的IMyModule是否为完全相同命名空间的类型:
- 可能存在引用错误项目/命名空间的情况,导致注册的类型和Handler依赖的类型不匹配,Autofac无法识别;
- 直接在
AutofacModules.cs中给IMyModule加上完整命名空间前缀,比如builder.RegisterType<MyModule>().As<MyApp.Modules.MyModule.Application.Contracts.IMyModule>(),重新测试。
2. 排查自定义构造函数查找器的影响
自定义的AllConstructorFinder会让Autofac尝试使用所有构造函数解析,而非默认的最优匹配逻辑:
- 检查
UpdateCommandHandler是否存在其他构造函数(比如无参构造),若存在,Autofac可能优先尝试其他构造但失败,最终抛出当前异常; - 暂时移除自定义构造函数查找器的配置,改用Autofac默认逻辑测试,看是否能正常解析。
3. 检查MyModule自身的依赖可解析性
如果MyModule存在构造函数依赖但未注册对应服务,Autofac无法创建MyModule实例,进而导致IMyModule解析失败:
- 给
MyModule添加无参构造函数测试,或检查其构造函数(若有)的依赖是否已在Autofac中注册。
4. 确认Autofac模块是否正确加载
检查AutofacModules是否被正确添加到容器配置中:
- 可以在
Load方法中添加断点或日志,确认该方法确实被执行; - 排查是否有其他模块覆盖了
IMyModule的注册。
5. 检查生命周期范围冲突
当前IMyModule注册为InstancePerLifetimeScope,需确认UpdateCommandHandler的生命周期是否兼容:
- 若
UpdateCommandHandler是单例注册,单例依赖短生命周期服务会引发解析问题,可调整两者的生命周期配置测试。
内容的提问来源于stack exchange,提问作者Griffin
相关产品推荐
相关产品推荐

