我已经使用Microsoft Bot Builder SDK v-4(预发行版)实现了一个漫游器。为了管理对话流程,我使用了两个简单的对话框-
问候对话框-对话框开始:首次打招呼用户
public Task DialogBegin(DialogContext dc, IDictionary<string, object> dialogArgs = null)
{
var state = dc.Context.GetConversationState<EchoState>();
string greetMessage = string.Format("Hi, I am {0}.", _botName);
dc.Context.SendActivity(greetMessage);
IList<CardAction> suggestedActions = new List<CardAction>
{
//some card action suggestions
};
var activity = MessageFactory.SuggestedActions(suggestedActions, text: "Please select the area of conversation.");
dc.Context.SendActivity(activity);
dc.End();
return Task.CompletedTask;
}
对话对话框-对话框开始:在与用户打招呼后继续进行后续对话
public Task DialogBegin(DialogContext dc, IDictionary<string, object> dialogArgs = null)
{
string activity = "test";
dc.Context.SendActivity(activity);
dc.Continue();
return Task.CompletedTask;
}
我在Bot类的GreetingDialog
方法内,在ConversationUpdate
事件中调用ConversationDialog
,在随后的消息接收事件中调用OnTurn
。
OnTurn事件:
public async Task OnTurn(ITurnContext context)
{
var state = context.GetConversationState<EchoState>();
var dialogCtx = _dialogs.CreateContext(context, state);
if (context.Activity.Type == ActivityTypes.ConversationUpdate)
{
//Greet user first time
if (context.Activity.MembersAdded[0].Id == "default-user")
{
return;
}
if (!context.Responded)
{
var args = new Dictionary<string, object>
{
["greetingArgs"] = context.Activity.Text
};
await dialogCtx.Begin("greetingDialog", args);
}
}
else if (context.Activity.Type == ActivityTypes.Message)
{
await dialogCtx.Continue(); //this line is supposed to execute Begin the active dialog again??
//if (!context.Responded)
if(dialogCtx.ActiveDialog == null || !dialogCtx.Context.Responded)
{
var args = new Dictionary<string, object>
{
["conversationArgs"] = context.Activity.Text
};
await dialogCtx.Begin("conversationDialog", args);
}
}
}
使用上面的代码,我被重定向到ConversationDialog
,但是它仅通过await dialogCtx.Begin("conversationDialog", args);
发生。我执行DialogBegin
时是否应该重定向到“活动”对话框的await dialogCtx.Continue();
?我可以看到“活动”对话框是“ conversationDialog”,调试器逐步通过await dialogCtx.Continue();
。请帮忙吗?
答案 0 :(得分:0)
我想我明白了。我们可以像这样为Dialog类实现IDialogContinue
接口-
public class QnADialog : IDialog, IDialogContinue
{
public Task DialogBegin(DialogContext dc, IDictionary<string, object> dialogArgs = null)
{
string activity = "test";
dc.Context.SendActivity(activity);
//dc.Continue();
return Task.CompletedTask;
}
public Task DialogContinue(DialogContext dc)
{
dc.Context.SendActivity("dc continue");
dc.Context.Responded = true;
return Task.CompletedTask;
}
}
然后,我们可以使用DialogContinue
方法来处理调用代码中的DialogContext.Continue()
。