如何在ASP.NET Core中通过自定义配置类配置Application Insights
我的应用使用Azure App Configuration提供配置值,已在ASP.NET Core启动流程中完成配置,且已将MyAppConfig单例注入服务容器:
serviceCollection.AddSingleton<MyAppConfig>();
现在我希望使用该配置对象中的值来配置Application Insights,但在启动过程中无法从服务提供程序获取MyAppConfig服务。我找到微软文档提及可使用IConfiguration处理,但更希望直接通过自定义对象设置连接字符串等参数,且文档未明确IConfiguration所需的配置键。
附代码示例说明需求:
// MyAppConfig.cs
class MyAppConfig { protected IConfiguration config { get; set; } public MyAppConfig(IConfiguration config) { this.config = config; } public string AppInsightsConnectionString { get { return config["appInsights-connectionString"]; } } }
// Program.cs
var builder = WebApplication.CreateBuilder(args); builder.Host.ConfigureAppConfiguration((_, confBuilder) => { builder.AddAzureAppConfiguration(/*init Azure App Configuration*/); confBuilder.AddSingleton<MyAppConfig>(); }); builder.Services.AddApplicationInsightsTelemetry(); // 希望此处使用单例MyAppConfig中的AppInsightsConnectionString
请问如何在ASP.NET Core中使用自定义服务(简单类实例)作为Application Insights的配置源?
可以通过两种方式实现用自定义MyAppConfig配置Application Insights:
方式一:提前构建实例直接传入
先完成配置体系的构建,手动实例化MyAppConfig后直接传入Application Insights配置:
修改Program.cs如下:
var builder = WebApplication.CreateBuilder(args); // 配置Azure App Configuration builder.Host.ConfigureAppConfiguration((_, confBuilder) => { confBuilder.AddAzureAppConfiguration(/* 你的Azure App配置初始化代码 */); }); // 手动创建MyAppConfig实例(此时IConfiguration已就绪) var myAppConfig = new MyAppConfig(builder.Configuration); // 将实例注入服务容器 builder.Services.AddSingleton(myAppConfig); // 使用MyAppConfig中的连接字符串配置Application Insights builder.Services.AddApplicationInsightsTelemetry(options => { options.ConnectionString = myAppConfig.AppInsightsConnectionString; }); var app = builder.Build(); // 后续中间件配置... app.Run();
注意:原代码中confBuilder.AddSingleton<MyAppConfig>()是错误写法,服务注入必须放在builder.Services下,ConfigureAppConfiguration仅用于配置体系构建。
方式二:利用服务容器回调获取实例
使用AddApplicationInsightsTelemetry的重载方法,在服务容器构建完成后从容器中获取MyAppConfig:
修改Program.cs如下:
var builder = WebApplication.CreateBuilder(args); builder.Host.ConfigureAppConfiguration((_, confBuilder) => { confBuilder.AddAzureAppConfiguration(/* 你的Azure App配置初始化代码 */); }); // 先注入MyAppConfig到服务容器 builder.Services.AddSingleton<MyAppConfig>(); // 通过回调在服务容器就绪后获取配置 builder.Services.AddApplicationInsightsTelemetry((serviceProvider, options) => { var myAppConfig = serviceProvider.GetRequiredService<MyAppConfig>(); options.ConnectionString = myAppConfig.AppInsightsConnectionString; }); var app = builder.Build(); // 后续中间件配置... app.Run();
该回调会在服务容器完全构建后执行,此时可以正常获取已注入的MyAppConfig实例。
内容的提问来源于stack exchange,提问作者Thomas

