首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在第一步机器人框架v4之后,将访问器传递到WaterfallDialog会导致错误

在第一步机器人框架v4之后,将访问器传递到WaterfallDialog会导致错误
EN

Stack Overflow用户
提问于 2019-01-08 03:30:49
回答 1查看 136关注 0票数 1

当我将BotAccessors从主对话框传递到另一个对话框时,遇到了问题。我的动机是发送访问器up,因为我需要从任何对话框访问并保存UserProfile中的状态。这就是我传递它的方式:

代码语言:javascript
复制
await dialogContext.BeginDialogAsync(SiteReviewDialog.id, _accessors, cancellationToken: cancellationToken);

SiteReviewDialog可以很好地运行它的第一步并提示用户,但它甚至在进入第二步之前就出错了(断点不会命中)。我尝试在SiteReviewDialog中删除所有对accessors的引用,似乎修复这个问题的唯一方法就是根本不传递accessors。如果我传递accessors,我得到的错误是:http://freetexthost.com/sdgdilpyxv

在错误中,第232行在我的OnTurnAsync

代码语言:javascript
复制
var dialogContext = await _dialogs.CreateContextAsync(turnContext, cancellationToken);

我尝试从第一个AddStep(async (stepContext, cancellationToken)开始跟踪SiteReviewDialog中的代码执行,它逐行退出,然后点击OnTurnAsync,到达第232行,然后出现错误。有人有什么建议吗?

EN

Stack Overflow用户

回答已采纳

发布于 2019-01-08 04:13:03

首先解释一下发生了什么:您传递给_accessors的参数是为对话框的"options“对象保留的。这类似于设置对话框的行为方式。例如,在提示的情况下,这始终是一个PromptOptions子类。在对话框的执行生命周期内,这些选项对象将被序列化并存储在堆栈中,因此在传递_accessors时会出现异常,原因是它包含不可序列化的类型。所以,长话短说,你不想以这种方式传递你的访问器。

访问器是有效的单例,你想要做的就是通过你的对话框的构造函数链传递它们。因此,您可以将IStatePropertyAccessor<T> (或者"accessors“类,如果您已经决定遵循该模式)传递给SiteReviewDialog构造函数,然后确保将其传递给它通过构造函数创建的任何子对话框。注意:对话框本身实际上也应该被创建为单例。

从那时起,只需在需要时使用访问器,因为您总是给它一个ITurnContext,它应该从中加载数据,并且单例实例使用特定于该上下文的标识符来确保加载正确的数据。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54080639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档