如何在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.DependencyInjectionNuGet包,确保依赖完整。 - 若自定义动作以NuGet包形式引入根项目,确保
BotComponent类处于可访问命名空间下,显式注册能避免自动发现失败的问题。
内容的提问来源于stack exchange,提问作者Brane
相关产品推荐
相关产品推荐

