Как загрузить указанный диалог c и его ресурсы, не загружая каждый диалог в примере кода? - PullRequest
0 голосов
/ 26 марта 2020

Ссылка Github для примера кода, который я использую

В файле AdaptiveBot.cs,

Создает список всех доступных подсказок и принимает пользователя введите и запустите указанное приглашение.

Я хочу изменить его так, чтобы оно загружало только одно диалоговое окно (в папке с примерами имеется 7 приглашений, и оно дает возможность загрузить любое)

Как бы я go собирался загрузить только одно диалоговое окно, например, для загрузки необходим только MultiTurnPromptBot, а остальные не нужны.

private void LoadDialogs()
{
    System.Diagnostics.Trace.TraceInformation("Loading resources...");

    //For this sample we enumerate all of the .main.dialog files and build a ChoiceInput as our rootidialog.
    this.dialogManager = new DialogManager(CreateChoiceInputForAllMainDialogs());
    this.dialogManager.UseResourceExplorer(this.resourceExplorer);
    this.dialogManager.UseLanguageGeneration();

    System.Diagnostics.Trace.TraceInformation("Done loading resources.");
}

private AdaptiveDialog CreateChoiceInputForAllMainDialogs()
{
    var dialogChoices = new List<Choice>();
    var dialogCases = new List<Case>();
    foreach (var resource in this.resourceExplorer.GetResources(".dialog").Where(r => r.Id.EndsWith(".main.dialog")))
    {
        var name = Path.GetFileNameWithoutExtension(Path.GetFileNameWithoutExtension(resource.Id));
        dialogChoices.Add(new Choice(name));
        var subDialog = resourceExplorer.LoadType<AdaptiveDialog>(resource);
        dialogCases.Add(new Case($"{name}", new List<Dialog>() { subDialog }));
    }

    var dialog = new AdaptiveDialog()
    {
        AutoEndDialog = false,
        Triggers = new List<OnCondition>() {
            new OnBeginDialog() {
                Actions = new List<Dialog>() {
                    new ChoiceInput() {
                        Prompt = new ActivityTemplate("What declarative sample do you want to run?"),
                        Property = "conversation.dialogChoice",
                        AlwaysPrompt = true,
                        Style = ListStyle.List,
                        Choices = new ChoiceSet(dialogChoices)
                    },
                    new SendActivity("# Running ${conversation.dialogChoice}.main.dialog"),
                    new SwitchCondition(){
                        Condition = "conversation.dialogChoice",
                        Cases = dialogCases
                    },
                    new RepeatDialog()
                }
            }
        }
    };
    return dialog;
}

1 Ответ

1 голос
/ 28 марта 2020

Вы можете видеть, что LoadDialogs создает экземпляр диспетчера диалогов, передавая адаптивный диалог в его конструктор. Таким образом, вместо создания диалогового окна root, которое запускает все остальные диалоговые окна, вы можете просто передать одно из этих диалоговых окон как диалоговое окно root, так как они все равно являются адаптивными. Вы можете видеть, что файлы декларативного диалога загружаются следующим образом:

this.resourceExplorer.GetResources(".dialog")

И затем из них создаются экземпляры адаптивного диалога следующим образом:

var subDialog = resourceExplorer.LoadType<AdaptiveDialog>(resource);

Таким образом, вы можете сделать что-то вроде этого:

private void LoadDialogs()
{
    System.Diagnostics.Trace.TraceInformation("Loading resources...");

    //For this sample we enumerate all of the .main.dialog files and build a ChoiceInput as our rootidialog.
    //this.dialogManager = new DialogManager(CreateChoiceInputForAllMainDialogs());

    this.dialogManager = new DialogManager(this.resourceExplorer.LoadType<AdaptiveDialog>(this.resourceExplorer.GetResource("MultiTurnPrompt.main.dialog")));

    this.dialogManager.UseResourceExplorer(this.resourceExplorer);
    this.dialogManager.UseLanguageGeneration();

    System.Diagnostics.Trace.TraceInformation("Done loading resources.");
}

TL; DR: Заменить эту строку:

this.dialogManager = new DialogManager(CreateChoiceInputForAllMainDialogs());

На эту строку:

this.dialogManager = new DialogManager(this.resourceExplorer.LoadType<AdaptiveDialog>(this.resourceExplorer.GetResource("MultiTurnPrompt.main.dialog")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...