在您的问题 1 中,您有大致的想法。您需要的是一个“共享”或全局状态,与 Bot Framework 的 CafeBot 中展示的状态不同(查看示例 => dotnet => #50 )。
如果您有一个“全局”状态集,您可以将在 Waterfall 1 中检索到的用户名列表保存到该状态。然后,当您的第二个或第三个瀑布通过您的 LUIS 意图调用时,您将瀑布 1 结果的状态访问器传递给瀑布 2 的父类,从而使其他瀑布可以访问它们。
如果您依赖 LUIS,则无需将它们按顺序排列。您可以使用 LUIS 让“搜索用户”触发器 WF1、“对用户执行 XYZ”触发器 2 和“对用户执行 ABC”触发器 3。这将使您的机器人对您的机器人用户不那么严格,因为他们可以进行搜索,然后根据需要执行 2 或 3 (或两者)。
我可以通过简单地向 Bot Framework MessageRoutingBot 添加一个额外的、基于瀑布的类来模拟这一点(samples => dotnet => #09)
这是“最喜欢的动物”提示的瀑布设置,包括从原始示例机器人访问 greetingState:
public TestDialog(IStatePropertyAccessor<TestState> testStateAccessor, IStatePropertyAccessor<GreetingState> greetingStateAccessor, ILoggerFactory loggerFactory)
: base(nameof(TestDialog))
{
TestStateAccessor = testStateAccessor ?? throw new ArgumentNullException(nameof(testStateAccessor));
GreetingStateAccessor = greetingStateAccessor ?? throw new ArgumentNullException(nameof(greetingStateAccessor));
// Add control flow dialogs
var waterfallSteps = new WaterfallStep[]
{
InitializeStateStepAsync,
PromptForAnimalStepAsync,
// PromptForCityStepAsync,
DisplayTestStateStepAsync,
};
AddDialog(new WaterfallDialog(ProfileDialog, waterfallSteps));
// AddDialog(new TextPrompt(NamePrompt, ValidateName));
AddDialog(new TextPrompt(AnimalPrompt));
}
使用 greetingState 访问器,它允许我继续从第二个瀑布按名称呼叫我的用户,而无需再次提示:
private async Task<DialogTurnResult> GreetUser(WaterfallStepContext stepContext)
{
var context = stepContext.Context;
var testState = await TestStateAccessor.GetAsync(context);
var greetingState = await GreetingStateAccessor.GetAsync(context);
// Display their profile information and end dialog.
await context.SendActivityAsync($"Hi {greetingState.Name}, who likes {testState.Animal}s, nice to meet you!");
return await stepContext.EndDialogAsync();
}
希望这会有所帮助!