botframework - 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 创建一个访问器,然后返回它。这只是示例,我对代码的描述可能不正确。
解决方案
你关于一切如何组合在一起的问题有点宽泛,但我会尝试一些解释:
startup.cs
: 机器人配置应该在这里加载,并创建单例。包括IStatePropertyAccessors
. 许多示例包含一个带有特定于 bot 的设置代码的BotConfig文件,并从启动时调用它。许多样本还包含一个机器人文件。机器人文件可以使加载一些机器人服务更容易。但是,它们不是必需的。ID 和密码仍然可以从 App Settings 或 web.config 中检索,并且您的代码可以创建服务。
通常在启动时初始化的一些事情是:
ICredentialProvider
sdk 使用它来创建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); }); }
- IStorage是用于与状态存储交互的实现。sdk 提供MemoryStorage CosmosDbStorage和AzureBlobStorage 这些都只是使用 JsonSerializer 从底层存储中存储和检索对象。
BotState
是为 IStorage 实现提供键的对象。SDK 提供了三个示例:ConversationState范围为 {channelId}/conversations/{conversationId}
由 {channelId}/users/{userId} 限定的UserState
PrivateConversationState范围为 {channelId}/conversations/{conversationId}/users/{userId}
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 扩展将消息处理程序添加到请求管道ApplicationBuilderExtensions和Microsoft.Bot.Builder.Integration.AspNet.WebApi使用HttpMessageHandler实现)。但是,您可以选择不使用集成库,并创建自己的控制器。喜欢这个示例:MVC-Bot
V4 附加参考
推荐阅读
- symfony4 - 奏鸣曲日期过滤器不起作用
- maven - jcenter 返回错误 403 Forbidden,我们应该改用什么?
- python - 插入操作中的 RBDMS sqlite3 错误..回滚
- reactjs - 自定义字体已加载但未在反应打字稿中应用
- javascript - 无法触发 WebRTC onTrack 事件,尽管 peerConnection 与数据通道一起使用
- java - 在 Python 中为 2 个不同的变量初始化 2D 数组/列表
- html - 在 vueJs 中有哪些“主题或设计选择器”的方法
- python - Selenium 在单击下一页按钮后继续滚动浏览不存在的页面
- php - 尝试在浏览器上打开我的 PHP 文件时如何摆脱解析错误
- r - 我可以在闪亮的应用程序中嵌入 PowerPoint 幻灯片吗