gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 06:00:57 26 4
gpt4 key购买 nike

我想将 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com