Передача аксессоров в WaterfallDialog вызывает ошибку после первого шага Bot Framework v4 - PullRequest
0 голосов
/ 07 января 2019

У меня проблема с BotAccessors, когда я передаю ее из основного диалога в другой диалог. Я мотивирован, чтобы отправить средства доступа, потому что мне нужно получить доступ и затем сохранить состояние в UserProfile из любого диалога. Вот как я это передаю:

await dialogContext.BeginDialogAsync(SiteReviewDialog.id, _accessors, cancellationToken: cancellationToken);

SiteReviewDialog отлично выполняет свой первый шаг и запрашивает пользователя, но он ошибается, даже не переходя ко второму шагу (контрольные точки не попадают). Я попытался удалить все ссылки на accessors в SiteReviewDialog, и, похоже, единственный способ исправить это - вообще не пропускать accessors. Если я пройду accessors, я получу ошибку: http://freetexthost.com/sdgdilpyxv

Начиная с ошибки, строка 232 находится в пределах моего OnTurnAsync:

var dialogContext = await _dialogs.CreateContextAsync(turnContext, cancellationToken);

Я попытался проследить за выполнением кода в SiteReviewDialog с первого AddStep(async (stepContext, cancellationToken), и он выходит из строки за строкой, затем нажимает OnTurnAsync и попадает в строку 232, затем с ошибками. У кого-нибудь есть предложения?

1 Ответ

0 голосов
/ 07 января 2019

Чтобы объяснить, что происходит в первую очередь: параметр, которому вы передаете _accessors, зарезервирован для объекта «options» для диалога. Это было бы что-то вроде настроек поведения Диалога. Например, в случае подсказок это всегда подкласс PromptOptions. Эти объекты параметров сериализуются и сохраняются в стеке в течение времени жизни диалогового окна, поэтому причина, по которой вы получаете исключение, передающее _accessors, состоит в том, что он содержит типы, которые не сериализуются. Итак, короче говоря, вы не хотите передавать свои средства доступа таким образом.

Средства доступа по сути являются одиночными, и вы хотели бы передать их через цепочку конструктора ваших диалогов. Таким образом, вы бы взяли IStatePropertyAccessor<T> (или класс «accessors», если решили следовать этому шаблону) в свой конструктор SiteReviewDialog, а затем удостоверились, что он передается в любые дочерние диалоги, которые он создает через их конструкторы. ПРИМЕЧАНИЕ: сами диалоги должны быть действительно созданы как одиночные.

Оттуда это просто вопрос использования аксессора, когда он вам нужен, потому что вы всегда даете ему ITurnContext, из которого он должен загружать свои данные, а экземпляр singleton использует идентификаторы, специфичные для этого контекста, чтобы гарантировать правильность данных. загружен.

...