当前,我正在尝试将我的v3机器人迁移到v4,而对于如何迁移v3 IDialog
则有些困惑。 v4中有什么等效功能以及如何使用它们?另外,如何在v4中进行活动转发?在v3中,它可能类似于await context.Forward(…)
?
非常感谢和问候! 法比安
答案 0 :(得分:3)
将V3对话框转换为V4时,一个好的起点就是更改:
IDialog
->
Dialog
或ComponentDialog
(视情况而定)
StartAsyc
->
BeginDialogAsync
MessageReceivedAsync
->
ContinueDialogAsync
IDialogContext
->
DialogContext
Microsoft Bot Builder V3 .net sdk广泛使用了 AutoFac ,并且与 Bot Builder 相比,开发人员通常看不见对话框堆栈> V4。 V3开发人员使用。Call
和。Forward
将对话框推入堆栈,并使用。EndDialog
弹出对话框。在V3中,对话框上的字段会自动进行序列化/反序列化,范围为PrivateConversationData
。无需专门配置对话框状态,SDK为每个机器人添加了此状态,并假定开发人员已使用autofac注册了有效的IBotDataStore<BotData>
实现。 PrivateConversationData
会自动访问ConversationData
,UserData
和IDialogContext
。
使用 Bot Builder V4,对话框堆栈和状态设置更多地由开发人员掌握。在BeginDialogAsync
和ContinueDialogAsync
方法中,DialogContext
有一个BeginDialogAsync
方法,它将作为当前对话框的子级启动该对话框(类似于V3)。对话框完成后继续使用子对话框返回的值是不同的,涉及使用.Forward
DialogTurnResult.Result
也引用了DialogContext
,而V4中的TurnContext
是DialogInstance
。从dialogContext.ActiveDialog
中,您可以检索DialogInstance
对象,该对象是一个DialogState
实现,它通过json序列化到在 Startup.cs V4中配置的存储中/从其中存储出来。保留IDictionary<string, object>
,UserData
和ConversationData
的概念。设置略有不同,但是这些数据存储区的作用域仍然保持不变:
用户状态使用通道ID和ID从中创建密钥。
PivateConversationData
对话状态使用通道ID和对话ID创建密钥。
{Activity.ChannelId}/users/{Activity.From.Id}#YourPropertyName
私人对话状态使用频道ID从ID和对话ID中创建密钥。
{Activity.ChannelId}/conversations/{Activity.Conversation.Id}#YourPropertyName
状态访问器是通过启动公司的{Activity.ChannelId}/conversations/{Activity.Conversation.Id}/users/{Activity.From.Id}#YourPropertyName
方法配置的。
文档可协助开发人员完成从V3到V4机器人的过程,并且正在进行对话框迁移。
一些链接,可进一步阅读v4对话框和状态:
Gather user input using a dialog prompt