亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在對話框中使用 Bot 狀態訪問器

在對話框中使用 Bot 狀態訪問器

C#
慕沐林林 2022-06-12 16:39:00
我在 Bot Framework 上呆了幾天,所以非常新。我一直在努力理解管理狀態,老實說,我只是不明白。似乎這方面的框架和建議最近發生了很大變化,似乎沒有任何明確的建議或示例。這個頁面說:將信息保存到機器人狀態。這將要求您設計您的對話框以訪問機器人的狀態屬性訪問器。但是沒有關于如何實現這一點的例子。我的一個瀑布對話框中的最后一步如下所示:AddStep(async (stepContext, cancellationToken) =>{    var response = stepContext.Result as FoundChoice;    stepContext.Values["maxPrice"] = response;    return await stepContext.BeginDialogAsync(SearchDialog.Id, null, cancellationToken);});它基本上是在啟動一個新對話框,我想SearchDialog通過傳遞對象或最好將這個對話框中收集的數據傳遞到 myBotAccessors中,然后SearchDialog檢索它并使用它。所有 MS 示例都將瀑布步驟定義為類async上的方法IBot。這也不是他們建議將機器人對話框放在一起的方式,這使得該示例總體上毫無用處。此外,似乎即使是 Microsoft v4 文檔也已過時,例如這個文檔,它仍然告訴我們使用已棄用的代碼,例如:options.State.Add(new ConversationState(storage));不幸的是,目前這些文檔似乎更令人困惑而不是對這個主題有幫助。管理這種狀態的最佳方法是什么?
查看完整描述

2 回答

?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

注意:Basic Bot 示例已被 Core Bot 示例替換,因此此答案已過時

查看在示例存儲庫中或通過在 Azure 中從模板創建基本機器人來設置基本機器人的方式。

狀態屬性訪問器在BasicBot類中聲明:

private readonly IStatePropertyAccessor<GreetingState> _greetingStateAccessor;

然后在BasicBot 構造函數中將其分配給:

_greetingStateAccessor = _userState.CreateProperty<GreetingState>(nameof(GreetingState));

然后將其傳遞GreetingDialog構造函數:

Dialogs.Add(new GreetingDialog(_greetingStateAccessor, loggerFactory));

然后將其分配給GreetingDialog類的屬性:

UserProfileAccessor = userProfileStateAccessor ?? throw new ArgumentNullException(nameof(userProfileStateAccessor));

然后在整個GreetingDialog類的許多地方使用GetAsyncSetAsync方法。例如:

var greetingState = await UserProfileAccessor.GetAsync(stepContext.Context, () => null);



查看完整回答
反對 回復 2022-06-12
?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

瀑布對話框的最后兩個步驟可能如下所示:


public async Task<DialogTurnResult> AskForLocation(WaterfallStepContext sc, CancellationToken cancellationToken)

    {

        // the previous step asked for the Email so now bot is going to save it in botstate

        _state = await _accessor.GetAsync(sc.Context, () => new MyApplicationState());

        var email = _state.Email = (string)sc.Result;


        // this is not in the template because it is saving in a different manner

        // just being explicit about saving here

        await _accessor.SetAsync(sc.Context, _state);


        await sc.Context.SendActivityAsync("Got your email!");


        var prompt = new PromptOptions

        {

                Prompt = MessageFactory.Text($"Please specify location."),

        };


        return await stepContext.PromptAsync(locationPrompt, prompt);

    }


    public async Task<DialogTurnResult> FinishDialog(WaterfallStepContext sc, CancellationToken cancellationToken)

    {

        _state = await _accessor.GetAsync(sc.Context);

        _state.Location = (string)sc.Result;


        // save location this time

        await _accessor.SetAsync(sc.Context, _state);


        await sc.Context.SendActivityAsync("Got your location!");


        return await sc.EndDialogAsync();

    }

如果您退出了上面的對話框,并假設您實現了 StateBotAccessors并正在使用 UserProfile 屬性,那么您可以通過以下方式檢索它:


    var _state = await stateBotAccessors.UserState.UserProfileAccessor.GetAsync(context);

或者,如果您想從子對話框中傳遞它,您可以以以下方式結束:


    return await sc.EndDialogAsync(_state);


查看完整回答
反對 回復 2022-06-12
  • 2 回答
  • 0 關注
  • 162 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號