You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 03:09:27