如何使用 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,也是如此。
正如标题所说,我在 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,也是如此。