如何在Autofac容器中解析ILogger?从DryIOC迁移的实现疑问
将DryIOC的ILogger注册转换为Autofac实现
首先修正ILoggerFactory的注册语法(Autofac类型注册逻辑和DryIOC不同),再实现ILogger的动态解析逻辑,匹配你原来DryIOC中根据父组件类型创建Logger的行为。
步骤1:正确注册ILoggerFactory
Autofac需用RegisterType<TImplementation>().As<TService>()的语法完成类型映射,同时ILoggerFactory通常设为单例生命周期:
public void Load(ContainerBuilder builder) { // 注册ILoggerFactory,绑定Log4NetLoggerFactory实现,单例生命周期 builder.RegisterType<Log4NetLoggerFactory>() .As<ILoggerFactory>() .SingleInstance(); ConfigureLogger(builder); }
步骤2:注册ILogger,实现动态类型匹配
DryIOC中你通过Made.Of指定从ILoggerFactory.Create(Type)方法创建Logger,并根据父组件类型传入参数。Autofac可通过上下文解析+工厂方法实现相同逻辑:
[Localizable(false)] private void ConfigureLogger(ContainerBuilder builder) { builder.Register<ILogger>(context => { // 获取当前依赖ILogger的父组件类型,无父组件则 fallback 到Startup类型 var targetType = context.ComponentRegistry .TryGetRegistration(context.ResolveRequest.Target, out var registration) ? registration.Activator.LimitType : typeof(Startup); // 解析ILoggerFactory并创建对应类型的Logger var loggerFactory = context.Resolve<ILoggerFactory>(); return loggerFactory.Create(targetType); }) .InstancePerDependency(); // 对应DryIOC的Reuse.Transient,每次解析生成新实例 }
关键逻辑说明
context.ResolveRequest.Target:获取当前请求解析的目标组件,以此拿到父组件的类型信息,等价于DryIOC中的r.Parent?.ImplementationTypeInstancePerDependency():Autofac的瞬时生命周期,和DryIOC的Reuse.Transient行为完全一致- 整个lambda表达式模拟了DryIOC中
Made.Of指定的工厂方法调用逻辑,确保Logger基于依赖它的组件类型创建
内容的提问来源于stack exchange,提问作者Marcelll
相关产品推荐
相关产品推荐

