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

如何在Bot Framework Composer自定义动作组件中使用ILogger

解决Bot Framework Composer自定义动作中ILogger注入为null的问题

核心原因

自定义动作作为独立组件时,依赖注入容器未正确注册该组件的服务,导致构造函数中的ILogger<T>无法被解析注入。

解决方案步骤

1. 实现BotComponent类

在自定义动作的项目中创建继承自BotComponent的类,在其ConfigureServices方法中注册自定义动作类型,确保日志服务可被正确注入:

using Microsoft.Bot.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Logging;

public class CustomActionsBotComponent : BotComponent
{
    public override void ConfigureServices(IServiceCollection services, IConfiguration configuration)
    {
        // 注册自定义动作,让DI容器能够解析它
        services.AddSingleton<SendSMSPaymentInformation>();
        
        // 显式声明ILogger服务注册,确保DI能正确解析泛型日志实例
        services.TryAddSingleton(typeof(ILogger<>), typeof(Logger<>));
    }
}

2. 验证构造函数配置

你的现有构造函数已使用[JsonConstructor]标记,需确保构造函数的所有参数类型都已在DI容器中注册。当前ILogger<SendSMSPaymentInformation>的配置已覆盖,无需额外修改构造函数代码。

3. 根项目加载自定义组件

在根项目的Program.cs中,将自定义组件添加到Bot的组件集合:

var builder = WebApplication.CreateBuilder(args);

// 注册Bot服务及自定义组件
builder.Services.AddBotFrameworkAdapter()
    .AddBot<YourBotClass>()
    .AddComponents()
    .AddComponent<CustomActionsBotComponent>();

// 保留原Serilog配置
builder.Host.UseSerilog((context, config) =>
{
    config.ReadFrom.Configuration(context.Configuration);
});

关键注意事项

  • 始终通过依赖注入使用ILogger<T>,避免直接调用Serilog静态Log类,保持代码与日志提供程序解耦。
  • 自定义动作项目需引用Microsoft.Bot.Builder和Microsoft.Extensions.DependencyInjection NuGet包,确保依赖完整。
  • 若自定义动作以NuGet包形式引入根项目,确保BotComponent类处于可访问命名空间下,显式注册能避免自动发现失败的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:50:21