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

ASP.NET Core 5.0自定义ITelemetryInitializer出现TelemetryConfiguration循环依赖如何解决

解决方案

核心思路是断开TelemetryConfiguration -> UserTelemetryInitialiser -> IMemoryCache -> LoggerFactory -> TelemetryConfiguration的循环依赖链,可选用以下任意一种可行方案:

方案1:延迟获取IMemoryCache(推荐,改造成本最低)

不要在UserTelemetryInitialiser的构造函数中直接注入IMemoryCache,改为注入IServiceProvider,在Initialize方法执行时才从容器中获取缓存实例。Initialize方法只会在依赖容器完全构建完成后才会被调用,此时不会触发循环依赖。
修改后的代码示例:

public class UserTelemetryInitialiser : ITelemetryInitializer
{
    private readonly IHttpContextAccessor _contextAccessor;
    private readonly IServiceProvider _serviceProvider;

    public UserTelemetryInitialiser(IHttpContextAccessor contextAccessor, IServiceProvider serviceProvider)
    {
        _contextAccessor = contextAccessor;
        _serviceProvider = serviceProvider;
    }

    public void Initialize(ITelemetry telemetry)
    {
        // 执行时才从容器获取IMemoryCache,此时容器已完成初始化,无循环依赖
        using var scope = _serviceProvider.CreateScope();
        var cache = scope.ServiceProvider.GetRequiredService<IMemoryCache>();
        // 后续原有逻辑保持不变
    }
}

方案2:注册无日志依赖的专属MemoryCache实例

针对MyUserCache的依赖单独注册一个不使用LoggerFactory的IMemoryCache实例,避开对日志组件的依赖,直接断开循环链。
在Program.cs/Startup.cs的服务注册部分添加如下代码:

// 注册专属MemoryCache,无日志依赖,供UserTelemetryInitialiser使用
services.AddSingleton<IMemoryCache, MemoryCache>(sp => 
    new MemoryCache(new MemoryCacheOptions()));

注意:该实例不会输出MemoryCache相关的运行日志,如果你需要保留缓存日志可以选择方案1。

方案3:移除Application Insights日志提供器的依赖(不推荐)

如果你不需要把ASP.NET Core的日志输出到Application Insights,可以移除AddApplicationInsightsTelemetry()注册时自动添加的日志提供器,直接断开LoggerFactory到TelemetryConfiguration的依赖,但会丢失日志同步到AI的能力。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:15:01