如何在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
相关产品推荐
相关产品推荐

