botframework - Bot Composer 自定义操作中的依赖注入(inject)

标签 botframework bot-framework-composer

我想将 Bot composer 与自定义操作集成。自定义操作依次调用不同的 API 来执行某些业务逻辑。我想将接口(interface)和服务提供者注入(inject)自定义操作。尽管我已经在 startup.cs 中正确添加了所有内容,但我在执行此操作时遇到了麻烦,因为它失败并进入了空指针异常。你能解释一下我怎样才能做到这一点吗?

 [JsonConstructor]    
 public MultiplyDialog(IServiceProvider serviceProvider, [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
        : base()    
    {    
        serviceProvider.GetService<ApiService>() // serviceprovider always null    
        this.RegisterSourceLocation(sourceFilePath, sourceLineNumber);    
    }

最佳答案

您必须记住,在使用自适应对话框(即 Composer 的核心)时,对话框是单例的,并且在使用 Composer 时,它们不会从依赖注入(inject) (DI) 中实例化。

此外,由于对话框是单例,您不能(好吧,您可以但不应该)使用诸如构造函数注入(inject) DbContext 和类似服务(在使用 SDK 时,即编码时)。

解决此问题的最简单方法是使用 HttpRequest 操作使用 HTTP 请求。这是构建到整个自适应对话生态系统中以实现此类功能的方式。

如果您真的坚持在对话框中使用 DI,则必须从 TurnContext 解决 DI,并且必须在适配器中设置它。但是,这有点复杂,需要您使用自定义运行时。

更新 添加了使用自适应对话框实现 DI 的方法。

1 - 在适配器中注册turn状态的服务类

public class AdapterWithErrorHandler : BotFrameworkHttpAdapter
{
    public AdapterWithErrorHandler(
        IConfiguration configuration,
        ILogger<BotFrameworkHttpAdapter> logger,
        //...
        QnAClient qnaClient)
        : base(configuration, logger)
    {
        // Add QnAClient to TurnState so we can use it while in the turn
        Use(new RegisterClassMiddleware<QnAClient>(qnaClient));

        //...
    }
}

在上面的代码中,QnAClient 是使用 IHttpClientFactory 创建的类型化 HttpClient,因此使用单例是安全的。

2 - 在任何需要的地方从 TurnState 获取服务

public async Task SetPropertiesAsync(DialogContext context, ...)
{
    var qnaClient = context.Context.TurnState.Get<QnAClient>();

    //...
}

顺便说一句,当您在 ConfigureServices 中像这样注册它时,这是让 IHttpClientFactory 正确管理 HttpClient 的好方法:

services.AddHttpClient<QnAClient>()
    .AddTransientHttpErrorPolicy(p => p.WaitAndRetryAsync(new[] { 1, 2, 3, 5, 8, 13 }.Select(t => TimeSpan.FromSeconds(t))))
    .AddTransientHttpErrorPolicy(p => p.CircuitBreakerAsync(6, TimeSpan.FromSeconds(30)));

在本例中使用来自 Polly 的重试策略。

关于botframework - Bot Composer 自定义操作中的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67424361/

相关文章:

c# - Enterprise Bot 模板无法在单步 WaterfallDialog 中恢复 MainDialog

botframework - Bot Framework Composer - 安装的包没有出现在 'Installed' 菜单中

azure - 在 Bot Framework Composer 之外运行 Bot 项目

c# - Bot Framework Composer - 读取应用程序设置

c# - 下载在门户上创建的机器人会导致解决方案无效/无法运行

c# - BOT 不在网络聊天中运行

azure - LUIS 列出实体

save - 如何在 MS Bot 框架中保存对话数据

azure - "hostname"从 Composer 发布 Azure Bot

azure - 我应该使用哪种机器人解决方案,Botframework 或 Composer 工具或 Power Virtual Agent? Power 虚拟代理成本高吗?