You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过Autofac构造函数注入实现按类型的上下文日志记录?

实现构造函数注入类型的上下文日志记录

我来帮你搞定这个构造函数注入类型的问题,实现上下文感知的日志记录。你需要修改Autofac模块里的Logger注册逻辑,利用Autofac的解析上下文动态获取当前依赖ILogger的组件类型,再把这个类型传递给Logger的构造函数。

核心思路

Autofac在解析组件时会维护一个解析上下文,我们可以通过这个上下文拿到当前正在被注入ILogger的目标组件类型,用这个类型实例化你的Logger,就能实现按组件类型绑定的日志记录。

修改后的LogModule代码

public class LogModule : Autofac.Module
{
    protected override void Load(ContainerBuilder builder)
    {
        // 注册ILogger,通过lambda动态获取目标组件类型
        builder.Register((ctx, parameters) =>
        {
            // 从解析上下文获取当前需要注入ILogger的组件类型
            var targetComponentType = ctx.ResolveOperation.Target.Activator.LimitType;
            return new Logger(targetComponentType);
        })
        .As<ILogger>()
        .InstancePerDependency(); // 每个依赖组件都获取专属的Logger实例

        base.Load(builder);
    }
}

代码细节解释

  • ctx.ResolveOperation.Target.Activator.LimitType:这行代码从Autofac的解析流程里,精准拿到当前需要注入ILogger的组件实际类型。比如你解析UserService(它的构造函数依赖ILogger)时,这里拿到的就是UserService的Type。
  • InstancePerDependency:显式指定每个依赖ILogger的组件都得到一个绑定自身类型的Logger实例,避免不同组件共享同一个Logger(毕竟每个Logger对应的日志分类是不同的)。

验证效果示例

假设你有一个服务类:

public class UserService
{
    private readonly ILogger _logger;

    public UserService(ILogger logger)
    {
        _logger = logger;
    }

    public void DoSomething()
    {
        // 此时_logger内部的底层日志器是针对UserService类型创建的
        _logger.Info("执行用户操作...");
    }
}

当Autofac解析UserService时,会自动把UserService的Type传递给Logger的构造函数,完美实现你想要的按类型上下文日志记录。

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

火山引擎 最新活动