如何通过Autofac注入现有LoggerFactory生成的ILogger<TypeA>实例
问题描述
现有代码如下:
public class TypeA : InterfaceA { private ILogger _logger; public TypeA(ILogger logger) { _logger = logger; } } public class Main { ... var loggerFactory = new LoggerFactory(); ILogger<TypeA> typeALogger = _loggerFactory.CreateLogger<TypeA>(); var typeAObj = new TypeA(typeALogger); ... }
现在希望通过Autofac创建TypeA实例,使用如下代码:
// Autofac is configured ... using var scope = container.BeginLifetimeScope(); var typeAObj = scope.Resolve<InterfaceA>();
需要实现让TypeA构造函数注入由现有LoggerFactory生成的ILogger<TypeA>实例。
解决方案
按以下步骤配置Autofac即可实现需求:
注册现有LoggerFactory实例
将已创建好的LoggerFactory实例注册到容器,确保后续创建日志对象时复用该实例。配置ILogger
的自动解析逻辑
通过泛型注册,让Autofac在需要ILogger<T>时,自动调用已注册的LoggerFactory生成对应类型的日志实例。注册InterfaceA与TypeA的映射
将InterfaceA的实现类TypeA注册到容器,这样解析InterfaceA时,Autofac会自动注入所需的日志依赖。
完整配置代码示例:
// 假设已初始化好loggerFactory实例 var loggerFactory = new LoggerFactory(); // 可按需添加日志提供者,例如控制台输出 // loggerFactory.AddConsole(); // 创建Autofac容器构建器 var builder = new ContainerBuilder(); // 1. 注册现有LoggerFactory实例 builder.RegisterInstance(loggerFactory).As<ILoggerFactory>(); // 2. 注册ILogger<T>的泛型实现 builder.RegisterGeneric(typeof(Logger<>)) .As(typeof(ILogger<>)) .SingleInstance(); // 3. 注册接口与实现类的映射 builder.RegisterType<TypeA>().As<InterfaceA>(); // 构建容器 var container = builder.Build(); // 正常解析实例 using var scope = container.BeginLifetimeScope(); var typeAObj = scope.Resolve<InterfaceA>();
补充说明
Logger<>是ILogger<T>的默认实现(来自Microsoft.Extensions.Logging库),泛型注册后会根据目标类型自动生成带类型标识的日志实例,更利于日志排查。- 如果TypeA的构造函数参数是
ILogger而非ILogger<TypeA>,可以通过显式指定参数的方式兼容:
builder.RegisterType<TypeA>() .As<InterfaceA>() .WithParameter((pi, ctx) => pi.ParameterType == typeof(ILogger), (pi, ctx) => ctx.Resolve<ILogger<TypeA>>());
内容的提问来源于stack exchange,提问作者Cellcon
相关产品推荐
相关产品推荐

