Bot Framework Composer自定义动作项目读取appsettings.json遇技术问题求助
在Bot Framework Composer自定义动作中读取appsettings.json的解决方案
一、放弃旧的State读取方式,改用依赖注入(推荐)
旧方案dc.Parent.State.GetValue("settings")因版本迭代已过时,且泛型参数缺失导致CS0411错误。现代Composer项目基于依赖注入设计,推荐通过以下方式读取配置:
1. 添加必要NuGet包
在自定义动作项目中安装:
Microsoft.Extensions.ConfigurationMicrosoft.Extensions.Options(若使用强类型绑定)
2. 通过构造函数注入IConfiguration
修改自定义动作类,注入IConfiguration后直接读取配置:
using Microsoft.Extensions.Configuration; using Microsoft.Bot.Builder.Dialogs; using System.Threading.Tasks; using System.Threading; public class MyCustomAction : Dialog { private readonly IConfiguration _configuration; // 构造函数注入IConfiguration public MyCustomAction(IConfiguration configuration) { _configuration = configuration; } public override async Task<DialogTurnResult> BeginDialogAsync(DialogContext dc, object options = null, CancellationToken cancellationToken = default) { // 方式1:直接读取单个配置项 var targetSetting = _configuration["YourSettingKeyFromAppsettings"]; // 方式2:绑定到强类型对象(需提前定义类) var botSettings = _configuration.GetSection("BotSettings").Get<BotSettings>(); var typedSetting = botSettings?.YourStrongTypeSetting; // 执行你的自定义逻辑 return await dc.EndDialogAsync(result: targetSetting, cancellationToken: cancellationToken); } } // 强类型配置类(和appsettings.json结构对应) public class BotSettings { public string YourStrongTypeSetting { get; set; } // 其他配置属性... }
3. 注册自定义动作到依赖注入容器
在Composer生成的主Bot项目中(如Program.cs或BotConfiguration.cs),将自定义动作注册到DI容器:
services.AddTransient<MyCustomAction>();
二、解决旧方案的CS0411错误(不推荐)
如果一定要用旧的State读取方式,需补充泛型参数(仅兼容旧版本Composer):
// 指定泛型类型为Dictionary<string, object> var botSettings = dc.Parent.State.GetValue<Dictionary<string, object>>("settings"); // 再从字典中取值 var settingValue = botSettings["YourSettingKey"];
三、关于跨项目访问Settings的问题
无需修改主项目Settings的访问权限,也不需要引用主项目的命名空间:
- 主项目的Settings类默认是internal,跨项目引用并非最佳实践
- 直接通过
IConfiguration读取或强类型绑定,无需依赖主项目的内部类
内容的提问来源于stack exchange,提问作者DZW
相关产品推荐
相关产品推荐

