3

有人可以帮助如何使用 Bot Framweork 的最新预览/2.0 版本启用/开发自定义操作。微软文档似乎只适用于 v1.4.1

谢谢

4

2 回答 2

4

因此,BotComponents 是自定义操作的新途径。请按照此处的说明进行操作。您可能需要更改的两件事是:

  • 更新/添加Microsoft.Azure.KeyVault.Core. 我参加3.0.5了这两个项目。
  • 使用"components":[{"name":"MultiplyDialog"}]而不是"components":[{"name":"CustomAction.MultiplyDialog"}].

在第 2 点上,我遇到了构建错误 ( FileNotFoundException: Could not load file or assembly 'CustomAction.MultiplyDialog),因此执行了上述操作来解决。奇怪的是,一旦我能够在 VS 中构建,然后在 Composer 中运行和测试,它再次回到 . CustomAction.MultiplyDialog,但它可以工作。

2.0一旦发布,该文档应该成为 Composer 文档的途径。

于 2021-05-14T23:01:42.410 回答
0

请在此处找到文档。

  • 将一个名为 MultiplyDialog 的新项目添加到您的解决方案中。在 Visual Studio 中,右键单击解决方案资源管理器中的解决方案,然后选择添加 > 新项目。使用类库项目模板。

    • 添加对 Microsoft.Bot.Builder.Adaptive.Runtime 包的引用。使用与机器人所依赖的相同版本。

    • 将 bot 项目中的项目引用添加到组件项目中。右键单击项目并选择添加 > 项目引用。选择 MultiplyDialog 项目并单击 OK。

    • 构建整个解决方案以恢复所有包并验证依赖关系树。

创建自定义操作

Composer 中的操作是 Dialog 基类的特殊实现。这允许触发器中的每个操作被推送到对话框堆栈上,并依次执行。

在新项目中,将 Class1.cs 文件重命名为 MultiplyDialog.cs,并将其内容更新为如下所示:

using System;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
using AdaptiveExpressions.Properties;
using Microsoft.Bot.Builder.Dialogs;
using Newtonsoft.Json;

public class MultiplyDialog : Dialog
{
    [JsonConstructor]
    public MultiplyDialog([CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
        : base()
    {
        // enable instances of this command as debug break point
        RegisterSourceLocation(sourceFilePath, sourceLineNumber);
    }

    [JsonProperty("$kind")]
    public const string Kind = "MultiplyDialog";

    [JsonProperty("arg1")]
    public NumberExpression Arg1 { get; set; }

    [JsonProperty("arg2")]
    public NumberExpression Arg2 { get; set; }

    [JsonProperty("resultProperty")]
    public StringExpression ResultProperty { get; set; }

    public override Task<DialogTurnResult> BeginDialogAsync(DialogContext dc, object options = null, CancellationToken cancellationToken = default(CancellationToken))
    {
        var arg1 = Arg1.GetValue(dc.State);
        var arg2 = Arg2.GetValue(dc.State);

        var result = Convert.ToInt32(arg1) * Convert.ToInt32(arg2);
        if (this.ResultProperty != null)
        {
            dc.State.SetValue(this.ResultProperty.GetValue(dc.State), result);
        }

        return dc.EndDialogAsync(result: result, cancellationToken: cancellationToken);
    }
}

创建架构文件

组件的 .schema 文件是部分架构,将合并到机器人的主 .schema 文件中。虽然可以直接编辑机器人的主 sdk.schema 文件,但不建议这样做。合并部分模式文件将隔离更改,允许更轻松地从错误中恢复,并使组件更容易打包以供重用。

在名为 MultiplyDialog.schema 的项目中创建一个新文件,并将内容更新为以下内容:

{
    "$schema": "https://schemas.botframework.com/schemas/component/v1.0/component.schema",
    "$role": "implements(Microsoft.IDialog)",
    "title": "Multiply",
    "description": "This will return the result of arg1*arg2",
    "type": "object",
    "additionalProperties": false,
    "properties": {
        "arg1": {
            "$ref": "schema:#/definitions/integerExpression",
            "title": "Arg1",
            "description": "Value from callers memory to use as arg 1"
        },
        "arg2": {
            "$ref": "schema:#/definitions/integerExpression",
            "title": "Arg2",
            "description": "Value from callers memory to use as arg 2"
        },
        "resultProperty": {
            "$ref": "schema:#/definitions/stringExpression",
            "title": "Result",
            "description": "Value from callers memory to store the result"
        }
    }
}

创建 BotComponent 类

自适应运行时将在启动时动态发现和注入组件。

在项目中新建MultiplyDialogBotComponent.cs文件,更新内容为

using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.Dialogs.Declarative;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

public class MultiplyDialogBotComponent : BotComponent
{
     public override void ConfigureServices(IServiceCollection services, IConfiguration configuration)
     {
         // Anything that could be done in Startup.ConfigureServices can be done here.
         // In this case, the MultiplyDialog needs to be added as a new DeclarativeType.
         services.AddSingleton<DeclarativeType>(sp => new DeclarativeType<MultiplyDialog>(MultiplyDialog.Kind));
     }
}

在机器人项目的 appsettings.json 文件(位于 \settings)中,将 MultiplyDialogBotComponent 包含在 runtimeSettings/components 数组中。

"runtimeSettings": {
   "components": [
      {
         "name": "MultiplyDialog"
      }
   ]
}

合并架构文件

最后一步是将 MultiplyDialog 项目中的部分模式文件合并到机器人的主 sdk.schema 文件中。这使得自定义操作可在 Composer 中使用。

导航到 myBot 项目中的 schemas 文件夹。此文件夹包含一个 PowerShell 脚本和一个 bash 脚本。使用提升的 PowerShell 终端执行 PowerShell 脚本。您将需要复制/粘贴脚本的内容,或者确保您的执行策略允许运行未签名的脚本。

要验证脚本是否成功执行,请在 MyBot\schemas\sdk.schema 文件中搜索 MultiplyDialog,并验证 MultiplyDialog.schema 文件中的部分模式是否包含在 sdk.schema 中。

于 2021-12-28T12:35:44.810 回答