首页 > 解决方案 > bot framework V4上Dialog实现的清晰解释

问题描述

有没有人可以解释如何正确地从机器人框架编写对话框?我正在尝试使用空机器人模板从头开始编写代码,以了解每一段代码以及它们为什么以及如何拼凑在一起。但即使在阅读了这么多遍之后,我也不知道它是如何正确实现的,也不知道如何在 Microsoft Bot Framework 中为对话框编码。我已经多次阅读了微软的文档和微软的许多版本或文档,但仍然无法理解它是如何将每段代码链接在一起的。甚至我发现的博客或网站也没有解释为什么需要这样的代码,只是要求你添加这个和那个。我了解概念,但不了解机制。代码似乎跨越了startup.cs、yourMainBotLogic.cs、dialogClassName.cs、BotAccessors.cs,这让我很困惑,程序运行的步骤和方式。

请详细解释为什么需要这些代码/组件/它有什么用途以及为什么它必须存在于此类文件中(例如 Startup.cs)。例如;

var accessors = new BotAccessors(conversationState) { ConversationDialogState = conversationState.CreateProperty<DialogState>("DialogState"), }; return accessors;

为 DialogState 创建一个访问器,然后返回它。这只是示例,我对代码的描述可能不正确。

标签: botframework

解决方案


你关于一切如何组合在一起的问题有点宽泛,但我会尝试一些解释:

startup.cs: 机器人配置应该在这里加载,并创建单例。包括IStatePropertyAccessors. 许多示例包含一个带有特定于 bot 的设置代码的BotConfig文件,并从启动时调用它。许多样本还包含一个机器人文件。机器人文件可以使加载一些机器人服务更容易。但是,它们不是必需的。ID 和密码仍然可以从 App Settings 或 web.config 中检索,并且您的代码可以创建服务。

通常在启动时初始化的一些事情是:

  • ICredentialProvidersdk 使用它来创建BotAdapter并提供JWT Token Auth。对于单个 appid/password 机器人,SDK 提供了一个SimpleCredentialProvider. 如果您的机器人正在使用集成库,您可以在IBot初始化期间创建一个,或者只为 botConfig 提供 appid/pass:

网络API:

    公共静态无效寄存器(HttpConfiguration 配置)
    {
         config.MapBotFramework(botConfig =>
        {
          var appId = ConfigurationManager.AppSettings[MicrosoftAppCredentials.MicrosoftAppIdKey];
          var pass = ConfigurationManager.AppSettings[MicrosoftAppCredentials.MicrosoftAppPasswordKey];

          botConfig.UseMicrosoftApplicationIdentity(appId, pass);
        }
    }

网核:

    公共无效配置服务(IServiceCollection 服务)
    {
       services.AddBot(选项 =>
     {
        options.CredentialProvider = new SimpleCredentialProvider(appId, appPassword);
     });           
    }



  • BotState是为 IStorage 实现提供键的对象。SDK 提供了三个示例:


  • IStatePropertyAccessors这些是提供对上述作用域 BotState 的类型访问的实现层。执行 get/set 时,会查询并保存实际的状态存储(通过 sdk 提供的内部缓存)。

  • BotAccessors.cs只是一个容器来保存状态类和 IStatePropertyAccessors。这不是必需的,但为了方便起见。

yourMainBotLogic.cs:这是适配器的 OnTurn 实现存在的地方,应该加载对话框堆栈并处理用户的消息。对话框堆栈由包含 DialogData 类型的 IStatePropertyAccessor 的对话框集管理。当通过调用 create context 对该属性访问器执行获取时,将查询状态存储以填充 DialogContext 的对话框堆栈。

dialogClassName.cs是一个对话实现。具体的对话框类型在此处描述:对话框类型如何使用它们的示例在 github 上的示例和文档中。

与其他 asp.net 应用程序一样,启动在应用程序首次加载时运行(请参阅aspnet-web-api-poster生命周期-of-an-aspnet-mvc-5-application并注意Microsoft.Bot.Builder.Integration .AspNet.Core使用 IApplicationBuilder 扩展将消息处理程序添加到请求管道ApplicationBuilderExtensionsMicrosoft.Bot.Builder.Integration.AspNet.WebApi使用HttpMessageHandler实现)。但是,您可以选择不使用集成库,并创建自己的控制器。喜欢这个示例:MVC-Bot

V4 附加参考


推荐阅读