如何使用 Bot Framework Composer 中定义的对话框调用 "BeginDialogAsync" 方法

How to call "BeginDialogAsync" method using a dialog defined in Bot Framework Composer

正如标题所说,我在 Bot Framework Composer 中创建了我的 Bot,并希望能够在 C# 中手动调用 (BeginDialogAsync) 那些对话框,比如我可以访问 DialogContext 的 bot 组件。

一些上下文:我想要这个的全部原因是,无论出于何种原因,似乎没有办法使用作曲家动作“开始新对话框”,我可以在其中为它分配一个 属性,其中包含我希望启动的对话框的名称(即使它具有“表达式”类型的输入)。另一种方法是预定义 60 个不同的“开始新对话”操作,这是不可行的。

我在谷歌上进行了大量搜索并找到了几个解决方案,但是 none 似乎适用于最新版本的 Bot Framework Composer 2.x 和 Bot Framework SDK 4.x

我尝试过的事情通常围绕着使用 ResourceExplorer 加载“.dialog”文件。我最后一次尝试是加载“.dialog”文件并将其转换为 AdaptiveDialog,但这只会引发错误: 无法创建类型 Microsoft.Bot.Builder.Dialogs.Dialog 的实例。类型是接口或抽象class,无法实例化。

示例代码:

private void startDialogTest(DialogContext dc, CancellationToken cancellationToken, string dialogName)
{
    var dialogResource = _resourceExplorer.GetResource($"{dialogName}.dialog");
    var composerDialog = _resourceExplorer.LoadType<AdaptiveDialog>(dialogResource);

    dc.Dialogs.Add(composerDialog);

    dc.BeginDialogAsync(dialogName, cancellationToken: cancellationToken);
}

我理解为什么会发生这种情况,因为根本没有足够的信息,而且它不知道将 Json 反序列化为什么,因为 Dialog 是一个抽象的 class。

如果有人有示例代码或 github link 可以满足我的要求,我将不胜感激。

几天前我找到了解决问题的方法。

将 属性 分配给“开始新对话”操作不起作用的原因不是因为“表达式输入”本身不起作用,而是因为这样做会跳过 1 个关键步骤希望另一个对话能正常工作。

在该对话框 json 根目录中(单击“显示代码”选项)您需要定义一个数组,其中包含您希望能够跳转到的所有对话框的名称。

示例: 假设我们有名为 TestDialogA、TestDialogB 和 TestDialogC 的对话框。

我们希望对话框 TestDialogA 能够启动 TestDialogB 或 TestDialogC。这样做的方法是打开 TestDialogA 的 json 代码,并在根目录定义一个名为“dialogs”的 属性,您将在其中插入 TestDialogB 和 TestDialogC,如下所示:

{
  "$kind": "Microsoft.AdaptiveDialog",
----------------------------------------------------------- Insert Here
  "dialogs": [
    "TestDialogB",
    "TestDialogC"
  ],
---------------------------------------------------------- Insert Here
  "$designer": {
    "id": "s8Uwor",
    "name": "TestDialogA",
    "comment": ""
  }

这实际上是“开始一个新对话”应该做的,也是当您手动 hardcode/select 一个对话时它所做的,但是如果您向它发送 属性 它不会这样做包含您希望跳转到的对话框的值。

可能与它必须知道在编译时而不是运行时将跳转到哪个对话框“开始一个新对话框”有关,因为那时为时已晚。

这是关键的一步,因为没有它,TestDialogA 甚至不知道 TestDialogB 和 TestDialogC 的存在。如果您想从 TestDialogB 跳转到 TestDialogA,也是如此。