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

如何在EmailLoggerProvider中记录日志?规避循环依赖与DI依赖优化

问题:EmailLoggerProvider避免循环引用的日志记录方案

背景

我实现了一个基于EventId发送邮件记录消息的ILogger,邮件发送可能失败,需要记录该失败情况(已确保不会产生循环调用)。但直接给EmailLoggerProvider或其依赖注入ILogger/ILoggerFactory会导致循环引用。

无效的直接注入方式

尝试直接构造注入ILogger<EmailLoggerProvider>无法正常工作:

public class EmailLoggerProvider : ILoggerProvider 
{
    private readonly ILogger _logger;

    public EmailLoggerProvider(ILogger<EmailLoggerProvider> logger) // 此方式无效
    {
        _logger = logger;
    }

    // ...
        _logger.LogError(...);
}

当前临时解决方案

通过注入IServiceProvider,在需要日志时动态获取实例:

public class EmailLoggerProvider : ILoggerProvider 
{
    private readonly IServiceProvider _service;

    public EmailLoggerProvider(IServiceProvider service) 
    {
        _service = service;
    }

    // ...
        _service.GetRequiredService<ILogger<EmailLoggerProvider>>().LogError(...);
}

需求

希望找到无需依赖DI框架的更优方案。曾考虑过两种可行但需要额外服务注册的方式:

  • 使用Func<ILogger<EmailLoggerProvider>>,但需额外注册:services.AddSingleton(s => s.GetRequiredService<ILogger<EmailLoggerProvider>>())
  • 使用Lazy<ILogger<EmailLoggerProvider>>,同样需要额外的服务注册

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:04:59