当我将BotAccessors从主对话框传递到另一个对话框时,遇到了问题。我的动机是发送访问器up,因为我需要从任何对话框访问并保存UserProfile中的状态。这就是我传递它的方式:
await dialogContext.BeginDialogAsync(SiteReviewDialog.id, _accessors, cancellationToken: cancellationToken);SiteReviewDialog可以很好地运行它的第一步并提示用户,但它甚至在进入第二步之前就出错了(断点不会命中)。我尝试在SiteReviewDialog中删除所有对accessors的引用,似乎修复这个问题的唯一方法就是根本不传递accessors。如果我传递accessors,我得到的错误是:http://freetexthost.com/sdgdilpyxv
在错误中,第232行在我的OnTurnAsync中
var dialogContext = await _dialogs.CreateContextAsync(turnContext, cancellationToken);我尝试从第一个AddStep(async (stepContext, cancellationToken)开始跟踪SiteReviewDialog中的代码执行,它逐行退出,然后点击OnTurnAsync,到达第232行,然后出现错误。有人有什么建议吗?
发布于 2019-01-08 04:13:03
首先解释一下发生了什么:您传递给_accessors的参数是为对话框的"options“对象保留的。这类似于设置对话框的行为方式。例如,在提示的情况下,这始终是一个PromptOptions子类。在对话框的执行生命周期内,这些选项对象将被序列化并存储在堆栈中,因此在传递_accessors时会出现异常,原因是它包含不可序列化的类型。所以,长话短说,你不想以这种方式传递你的访问器。
访问器是有效的单例,你想要做的就是通过你的对话框的构造函数链传递它们。因此,您可以将IStatePropertyAccessor<T> (或者"accessors“类,如果您已经决定遵循该模式)传递给SiteReviewDialog构造函数,然后确保将其传递给它通过构造函数创建的任何子对话框。注意:对话框本身实际上也应该被创建为单例。
从那时起,只需在需要时使用访问器,因为您总是给它一个ITurnContext,它应该从中加载数据,并且单例实例使用特定于该上下文的标识符来确保加载正确的数据。
https://stackoverflow.com/questions/54080639
复制相似问题