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

如何在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?.ImplementationType
  • InstancePerDependency():Autofac的瞬时生命周期,和DryIOC的Reuse.Transient行为完全一致
  • 整个lambda表达式模拟了DryIOC中Made.Of指定的工厂方法调用逻辑,确保Logger基于依赖它的组件类型创建

内容的提问来源于stack exchange,提问作者Marcelll

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 05:50:26