我们本节来学习如何通过的库实现分支任务。
什么是分支任务?就是在和聊天机器人对话的过程中,具有条件判断的业务逻辑执行,例如本例中,如果年龄超过35岁会建议购买一份保险,询问购买保险的这个任务就属于一个分支任务。
在开始本章之前,我们需要使用如下两章创建的代码,请在开始本章之前,先阅读并遵循步骤创建一个项目:
按照上面两篇文章一步一步做完,就有了一个实现了收集用户昵称和年纪的聊天系统了,本章为了说明如何使用分支任务,我们再在里添加一个方法,该方法根据年龄来判断,如果用户的年龄大于35岁,询问用户是否愿意购买一份人身意外保险。
开始代码
首先我们需要打开文件, 添加如下的代码:
添加一个包的引用:
添加一个选择框,询问用户是否要购买保险。
添加一个用于处理选择框的方法。
在头部添加包引用:
usingMicrosoft.Bot.Builder.Dialogs.Choices;
更改构造器函数,添加需要的代码, 完成代码如下:
publicMainDialog() :base(nameof(MainDialog))
{
AddDialog(newTextPrompt("get-nick-name", NickNameNotNull));
AddDialog(newNumberPrompt("get-age"));
AddDialog(newChoicePrompt(nameof(ChoicePrompt)));
AddDialog(newWaterfallDialog(nameof(WaterfallDialog),newWaterfallStep[]{
GetNickName,
GetAge,
SetAgeForHealth,
ShowNickNameAndAge,
}));
InitialDialogId=nameof(WaterfallDialog);
}
注意这里添加的和在里添加的方法名:
我们现在来实现这个方法::
publicasyncTaskSetAgeForHealth(WaterfallStepContextwaterfallStepContext,CancellationTokencancellationToken)
{
varAge=Convert.ToInt32(waterfallStepContext.Result.ToString());
waterfallStepContext.Values["Age"]=Age;
if( Age>35)
{
varoptions=newPromptOptions()
{
Prompt=MessageFactory.Text("您愿意购买一份保险吗?"),
RetryPrompt=MessageFactory.Text("请您选择是否要购买保险。"),
Choices=GetChoices(),
};
returnawaitwaterfallStepContext.PromptAsync(nameof(ChoicePrompt), options, cancellationToken);
}
else
{
returnawaitwaterfallStepContext.NextAsync(cancellationToken);
}
}
从代码里可以看到当年龄大于35周岁时,这个时候开始做分支任务了。
最后我们还需要修一下方法:, 以便处理分支任务。
publicasyncTaskShowNickNameAndAge(WaterfallStepContextwaterfallStepContext,CancellationTokencancellationToken)
{
varAge=Convert.ToInt32(waterfallStepContext.Values["Age"]);
varNickName=waterfallStepContext.Values["NickName"];
varreply=waterfallStepContext.Context.Activity.CreateReply();
reply.Text=$"您好,您输入的昵称是:, 您输入的年龄是:";
if(Age>35)
{
varchoice=((FoundChoice)waterfallStepContext.Result).Value;
if(choice.Equals("购买保险"))
{
reply.Text+="您为自己购买了一份人身保险。";
}
}
awaitwaterfallStepContext.Context.SendActivityAsync(reply, cancellationToken);
returnawaitwaterfallStepContext.EndDialogAsync(null, cancellationToken);
}
最后,需要注意的是,我们使用了这个, 我们需要定义一个返回选项的方法;
privateIListGetChoices()
{
varcardOptions=newList()
{
newChoice() { Value="购买保险", Synonyms=newList() {"买","购买","够"} },
newChoice() { Value="不购买保险", Synonyms=newList() {"不","不买"} },
};
returncardOptions;
}
至此实现分支任务的全部代码都已经完成,运行一下,当问你的年龄的时候,输入36, 可以看到出发了分支任务:
领取专属 10元无门槛券
私享最新 技术干货