Botframework 如何在C#-CoreBot中构造QnA Maker实例类?

Botframework 如何在C#-CoreBot中构造QnA Maker实例类?,botframework,chatbot,azure-language-understanding,qnamaker,Botframework,Chatbot,Azure Language Understanding,Qnamaker,在运行我的核心机器人C#示例之后,我得到了一个系统.aggregateeexception 在Startup.cs中,我添加了如下类: services.AddSingleton(); 识别器类看起来像: 使用System.Net.Http; 使用系统线程; 使用System.Threading.Tasks; 使用Microsoft.Bot.Builder; 使用Microsoft.Bot.Builder.AI.QnA; 使用Microsoft.Bot.Schema; 使用Microsoft.

在运行我的核心机器人C#示例之后,我得到了一个
系统.aggregateeexception

Startup.cs
中,我添加了如下类:

services.AddSingleton();
识别器类看起来像:

使用System.Net.Http;
使用系统线程;
使用System.Threading.Tasks;
使用Microsoft.Bot.Builder;
使用Microsoft.Bot.Builder.AI.QnA;
使用Microsoft.Bot.Schema;
使用Microsoft.Extensions.Configuration;
使用Microsoft.Extensions.Logging;
命名空间CoreBot
{
公共类识别器:ActivityHandler
{
专用只读IConfiguration\u配置;
专用只读ILogger\u记录器;
私有只读IHttpClientFactory\U httpClientFactory;
公共聊天识别器(IConfiguration配置、ILogger记录器、IHttpClientFactory httpClientFactory)
{
_配置=配置;
_记录器=记录器;
_httpClientFactory=httpClientFactory;
}
受保护的重写异步任务OnMessageActivityAsync(ITurnContext turnContext,CancellationToken CancellationToken)
{
var httpClient=_httpClientFactory.CreateClient();
var qnaMaker=新qnaMaker(新qnaMaker点
{
KnowledgeBaseId=_配置[“QnAKnowledgebaseId”],
EndpointKey=_配置[“QnAEndpointKey”],
主机=_配置[“QnAEndpointHostName”]
},
无效的
httpClient);
_logger.LogInformation(“调用QnA Maker”);
var选项=新QnAMakerOptions{Top=1};
//对QnA Maker服务的实际调用。
var response=wait qnaMaker.GetAnswersAsync(turnContext,选项);
if(response!=null&&response.Length>0)
{
Wait turnContext.SendActivityAsync(MessageFactory.Text(响应[0]。应答),cancellationToken);
}
其他的
{
Wait turnContext.SendActivityAsync(MessageFactory.Text(“未找到QnA生成器答案”)、cancellationToken);
}
}
}
}
我甚至还没有使用这个类,但是如果没有错误,我甚至无法启动我的程序。 我该怎么办

错误代码:

“无法构造某些服务(验证服务描述符'ServiceType:CoreBot.ChitchAttRecognizer Lifetime:Singleton ImplementationType:CoreBot.ChitchAttRecognizer'时出错):在尝试激活'CoreBot.ChitchAttRecognizer'时,无法解析'System.Net.Http.IHttpClientFactory'类型的服务。”(验证服务描述符“ServiceType:Microsoft.BotBuilderSamples.Dialogs.MainDialog生存期:Singleton实现类型:Microsoft.BotBuilderSamples.Dialogs.MainDialog”时出错:在尝试激活“CoreBot.ChitchAttRecognitizer”时无法解析类型“System.Net.Http.IHttpClientFactory”的服务。)(验证服务描述符“ServiceType:Microsoft.Bot.Builder.IBot生存期:瞬态实现类型:Microsoft.BotBuilderSamples.Bots.DialogAndWelcomeBot`1[Microsoft.BotBuilderSamples.Dialogs.MainDialog]时出错)“:在尝试激活“CoreBot.ChitChatRecognizer”时,无法解析类型为“System.Net.Http.IHttpClientFactory”的服务。”


你的设置很奇怪……你正在制作你的
ChitchatRecognitizer
,这是一个机器人(它源于
ActivityHandler
),然后我想,你可能会将它放入一个对话框或另一个机器人中?你似乎还想处理QnAMaker(QnA的识别器)作为一个单例,但您在
OnMessageActivityAsync
中初始化它——这意味着除非您的bot接收到消息活动,否则它不会初始化,因此如果您试图初始化其他东西,则需要一个
QnAMaker
,它在启动时将不存在


无论如何,要回答如何将
QnAMaker
插入corebot的问题,如果您想将
QnAMaker
添加为单例,您可以在启动时将其添加为单例,然后在需要调用QnAMaker时从bot代码调用它

将QnAMaker添加到Corebot样本中

Startup.ConfigureServices
中:

//注册QnAMaker识别器
services.AddSingleton();
MyQnAMaker.cs

名称空间Microsoft.BotBuilderSamples
{
公共级MyQnaMaker
{
公共MyQnaMaker(IConfiguration配置)
{
ChitChatRecognizer=新QnAMaker(新QnAMakerEndpoint
{
KnowledgeBaseId=配置[“QnAKnowledgebaseId”],
EndpointKey=配置[“QnAEndpointKey”],
主机=配置[“QnAEndpointHostName”]
});
}
公共QnAMaker识别器{get;set;}
}
}
DialogAndWelcomeBot.cs构造函数

DI
QnAMaker
进入机器人

公共对话框和Welcomebot(会话状态会话状态、用户状态用户状态、T对话框、ILogger记录器、MyQnaMaker MyQnaMaker)
:base(会话状态、用户状态、对话框、记录器、myQnAMaker)
DialogBot.cs

public DialogBot(会话状态会话状态、用户状态UserState、T dialog、ILogger记录器、MyQnaMaker qnaMaker)
{
会话状态=会话状态;
UserState=UserState;
对话=对话;
记录器=记录器;
MyQnaMaker=qnaMaker;
}
...
受保护的重写异步任务OnMessageActivityAsync(ITurnContext turnContext,CancellationToken CancellationToken)
{