1 回答

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超21個(gè)贊
假設(shè)您在對(duì)話框的構(gòu)造函數(shù)中添加對(duì)話框,那么您將產(chǎn)生一個(gè)無限循環(huán),最終導(dǎo)致您所描述的堆棧溢出。
MainDialog --> DialogA --> DialogAchild --> MainDialog --> infinite loop
您提到的 PR 指的是一個(gè)稍微不同的問題。
解決此問題的一種方法是從構(gòu)造函數(shù)中刪除導(dǎo)致最終循環(huán)的 AddDialog 方法。相反,將調(diào)用移至 AddDialogA() 之類的方法,并僅在需要時(shí)調(diào)用它。
根據(jù)您的場(chǎng)景,您可以構(gòu)建一個(gè)提供此類功能的基本對(duì)話框。
這是您可以在必要時(shí)AuthenticatedDialog添加的產(chǎn)品示例。OnboardingDialog請(qǐng)注意,入職對(duì)話框本身繼承自 AuthenticatedDialog,當(dāng)您不卸載AddDialog()呼叫時(shí),這也會(huì)導(dǎo)致無限循環(huán)。
在基本對(duì)話框中抽象它很好,因?yàn)樗鼮槟峁┝艘恍┛梢允褂玫?API??紤]將您的內(nèi)容命名為 AddComponentDialog 或 UseComponentDialog。這樣你就很好地表達(dá)了你的意圖,潛在的讀者一開始就知道你正在使用可重用的組件。
AuthenticatedDialog.cs
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Schema;
using Bot.Dialogs.Authentication;
using Bot.Dialogs.Main;
using Bot.Dialogs.Onboarding;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Bot.Dialogs.Shared
{
public class AuthenticatedDialog : EnterpriseDialog
{
private BotStateAccessors _accessors;
private BotServices _botServices;
public AuthenticatedDialog(BotServices botServices, string dialogId, BotStateAccessors accessors) : base(botServices, dialogId)
{
_accessors = accessors;
_botServices = botServices;
AddDialog(new AuthenticationDialog("", accessors));
}
protected async Task<DialogTurnResult> AskForOnboardingAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken, object stepResult = null)
{
return await stepContext.BeginDialogAsync(nameof(OnboardingDialog), stepResult, cancellationToken);
}
protected void AddOnboardingDialog()
{
AddDialog(new OnboardingDialog(_botServices,_accessors));
}
}
}
DialogA.cs
public class DialogA : AuthenticatedDialog
{
public DialogA(BotServices botServices, BotStateAccessors accessors) : base(botServices, nameof(DialogA), accessors)
{
var preferencesDispatchSteps = new WaterfallStep[]
{
WaterfallStepA,
WaterfallStepB
};
AddDialog(new FooDialog);
AddOnboardingDialog();
}
}
- 1 回答
- 0 關(guān)注
- 74 瀏覽
添加回答
舉報(bào)