ASP.NET Core集成Autofac时AttachToComponentRegistration未调用问题
问题原因及修复方案
核心原因:方法签名不匹配,未正确重写基类虚方法
AttachToComponentRegistration不被调用的核心问题是Autofac版本迭代带来的签名变更:
从Autofac 6.0版本开始(也是ASP.NET Core 3.1+默认搭配的Autofac.Extensions.DependencyInjection依赖版本),Autofac.Module类的AttachToComponentRegistration虚方法第一个参数类型从旧版的IComponentRegistry改为了IComponentRegistryBuilder。当前代码里写的是旧版签名,并没有重写基类的虚方法,只是定义了一个同名的普通方法,Autofac框架自然不会调用它。这也解释了为什么Load方法能正常执行——Load方法的签名在版本迭代中没有变化。
修复步骤
- 修改
AttachToComponentRegistration的方法签名,引入Autofac.Core命名空间下的IComponentRegistryBuilder类型,方法内部的原有逻辑不需要改动,修改后代码如下:
protected override void AttachToComponentRegistration( IComponentRegistryBuilder componentRegistry, IComponentRegistration registration) { registration.Preparing += (sender, args) => { if (args.Parameters.Any(p => p == ILoggerCreatorParameter)) { return; } args.Parameters = new Parameter[] { ILoggerCreatorParameter }.Concat(args.Parameters); }; }
修改完成后,之前可能出现的“隐藏继承的成员”相关编译警告会自动消失。
- 调整Module注册时机
ASP.NET Core Autofac集成的服务注册顺序是固定的:
- 先执行
ConfigureServices,将所有框架、第三方服务加入IServiceCollection - 再调用
Populate方法将IServiceCollection中的所有服务批量导入Autofac的ContainerBuilder - 最后执行
ConfigureContainer中的自定义注册逻辑
Autofac加载Module时,会自动给当前ContainerBuilder中已经存在的所有注册执行Attach逻辑,同时订阅后续新增注册的事件。需要把日志Module的注册放到ConfigureContainer方法的最开头,再执行其他自定义服务注册,保证Populate导入的框架服务、后续自己注册的服务都能被正确捕获到上下文日志注入逻辑。
额外说明
当前在Load方法中写的ILogger注册逻辑可以正常工作,不需要额外修改。如果后续要简化代码,可以直接用Autofac自带的注册源实现上下文日志注入,不需要自己通过反射构造假参数。
内容的提问来源于stack exchange,提问作者Eike S
相关产品推荐
相关产品推荐

