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

.NET7最小API:公共类库中记录Application Insights及读取配置的最佳方案

最佳实现方案

核心思路是利用.NET的**依赖注入(DI)**机制,将Logger和配置直接注入到公共类库的服务中,避免手动传递参数,同时结合Application Insights的集成实现日志自动上报。

1. 定义配置类并绑定appsettings

先在公共类库中创建配置实体类,对应appsettings.json中的配置节,方便通过IOptions<T>注入:

// 公共类库中的配置实体
public class RegisterSettings
{
    public string DefaultRole { get; set; } = "User";
    public int MaxRetryCount { get; set; } = 3;
    // 按需添加其他配置项
}

在appsettings.json中添加对应配置:

{
  "RegisterSettings": {
    "DefaultRole": "User",
    "MaxRetryCount": 3
  },
  "ApplicationInsights": {
    "ConnectionString": "你的Application Insights连接字符串"
  }
}

2. 配置依赖注入与Application Insights

在项目的Program.cs中完成配置绑定、服务注册以及Application Insights集成:

var builder = WebApplication.CreateBuilder(args);

// 绑定配置到RegisterSettings
builder.Services.Configure<RegisterSettings>(builder.Configuration.GetSection("RegisterSettings"));

// 注册公共类库中的服务
builder.Services.AddScoped<IRegisterService, RegisterService>();

// 集成Application Insights,自动处理日志上报
builder.Services.AddApplicationInsightsTelemetry();

var app = builder.Build();

// 注册端点
new RegisterEndpoint().RegisterEndpoints(app);

app.Run();

3. 重构RegisterService注入Logger和配置

修改公共类库中的RegisterService,通过构造函数注入ILogger<RegisterService>和IOptions<RegisterSettings>,方法内直接使用,无需手动传递参数:

public class RegisterService : IRegisterService
{
    private readonly ILogger<RegisterService> _logger;
    private readonly RegisterSettings _settings;

    // 构造函数注入依赖
    public RegisterService(ILogger<RegisterService> logger, IOptions<RegisterSettings> settings)
    {
        _logger = logger;
        _settings = settings.Value;
    }

    public async Task<bool> RegisterUserAsync(User user)
    {
        try
        {
            // 使用配置项
            var defaultRole = _settings.DefaultRole;
            // 执行注册逻辑...
            return true;
        }
        catch (Exception ex)
        {
            // 记录异常日志,自动上报到Application Insights
            _logger.LogError(ex, "注册用户{UserId}失败", user.Id);
            return false;
        }
    }
}

4. 简化端点层代码

端点层只需注入IRegisterService,直接调用方法即可,无需处理日志和配置:

public class RegisterEndpoint : IEndpoint
{
    public void RegisterEndpoints(WebApplication app)
    {
        var apiRoute = app.MapGroup("api/register");
        apiRoute.MapPost("user", async (User user, IRegisterService regService) =>
        {
            // 替换为实际的用户存在性检查逻辑
            bool isUserExists = false;
            if (!isUserExists)
            {
                bool result = await regService.RegisterUserAsync(user);
                return result ? Results.Ok("注册成功") : Results.BadRequest("注册失败");
            }
            return Results.Conflict("用户已存在");
        });
    }
}

关键说明

  • 日志自动上报:集成Application Insights后,ILogger记录的所有日志(包括异常)会自动同步到Application Insights,无需额外代码。
  • 强类型配置:通过IOptions<T>获取配置,避免直接操作IConfiguration,代码更简洁且类型安全。
  • 依赖解耦:服务的依赖由DI容器自动注入,端点层与服务层无需传递Logger、配置等依赖,符合依赖倒置原则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:42:38