为什么机器人框架的IDialog是通用的?

时间:2017-07-24 12:35:44

标签: c# botframework

基于Microsoft bot框架的所有示例都使用通用IDialog接口作为IDialog<object>

此接口的通用目的是什么?通用名称用作out类型,documentation表示:

  

[...]可暂停的会话过程,产生的结果   输入TResult

但我找不到任何可以实际使用/演示此结果的地方。关于返回值的唯一演示使用上下文Done<T>(),它独立于对话框的类型参数。

1 个答案:

答案 0 :(得分:0)

事实上,它与context.Done<T>有关,但是当您在多个对话框的背景下考虑时,它会变得更加清晰。

当您呼叫(或转发传入消息)到新对话框时,您需要指定一个ResumeAfter<T>方法,该方法基本上是您在呼叫context.Done时将被呼叫的方法(或context.Fail)在新对话框中。

context.Call(new NameDialog(), this.NameDialogResumeAfter);

其中NameDialog定义为:

[Serializable]
public class NameDialog : IDialog<string>

正如您现在可以猜到的,<T>方法上的ResumeAfter与对话框中指定的<T>相关联。因此,如果您的对话框为IDialog<string>,则您的ResumeAfter<T>方法将如下所示:

private async Task NameDialogResumeAfter(IDialogContext context, IAwaitable<string> result)

如果在context.Done中您发送了其他类型,则在执行await result时,它可能会失败。

您可以查看以下示例: