Я изо всех сил пытаюсь скрыть IAwaitable до LuisResult (LUIS на платформе Microsoft Bot)

Я использую класс Microsoft.Bot.Builder.Dialog.Promptoptions, который принимает ResumeAfter, который является делегатом и требует (контекст IDialogContext, результат IAwaitable)

Однако делегат, которого я хочу вызвать, не относится к частному тесту асинхронной задачи (контекст IDialogContext, результат IAwaitable)

а скорее делегат LUIS, имеющий следующие

[LuisIntent ("Test") частный тест асинхронной задачи (контекст IDialogContext, результат LuisResult)

Мы будем очень признательны за то, чтобы услышать некоторые мысли о том, как вызвать метод с атрибутами LUIS.

    private async Task ProductChoice(IDialogContext context, IAwaitable<string> result)
    {

        PromptDialog.Choice<string>(
        context,
        ProductOverview,
        this.productOptions,
        "Which plaform are you interested in?",
        "Ooops, what you wrote is not a valid option, please try again",
        3,
        PromptStyle.PerLine);
        await context.PostAsync(context.MakeMessage());
    }        

    [LuisIntent ("Products")]
    public async Task ProductOverview(IDialogContext context, LuisResult result)
    {
        string product = "";
        EntityRecommendation rec;
        Activity activity = (Activity)context.MakeMessage();
        Attachment attachment;

        if (result.TryFindEntity("ProductName", out rec))
        {
            //Here you could include other rich cards
            attachment = CreateNewHeroCard(product = rec.Entity);
            activity.Attachments.Add(attachment);
            await context.PostAsync(activity);
        }
        else
        {
            await context.PostAsync("Sorry, their is no product by that name");
        }
    }

person user627289    schedule 02.06.2017    source источник
comment
Вам нужно показать больше кода. Как вы используете PromptOptions, почему вы ожидаете, что LuisResult будет возвращен в ваш обратный вызов?   -  person Evk    schedule 02.06.2017
comment
Вам может потребоваться некоторый рефакторинг кода и извлечение того, что сделано в вашем методе Test, в общий метод, используемый Luis result и ResumeAfter.   -  person Nicolas R    schedule 02.06.2017
comment
Вы не сможете этого сделать. Но рефакторинг кода будет проще, используйте общий метод.   -  person Ezequiel Jadib    schedule 02.06.2017
comment
Но PromptDialog.Choice<string> выполнит обратный вызов с результатом string, а не LuisResult, поэтому не уверен, как вы хотите, чтобы это работало.   -  person Evk    schedule 02.06.2017
comment
Дело в том, что я хотел бы использовать один из моих методов LUISIntend (ProductOverview) не только для обработки вызовов LUIS, но и для обработки некоторых вызовов ResumeAfter, поскольку иногда метод может вызываться непосредственно из бота, а иногда я хочу, чтобы метод был частью логический поток. Здесь вы можете увидеть, что я пытаюсь вызвать ProductOverview из PromptDialog, который я инициировал выше. Естественно, это не удается, но как я могу вызвать свой метод ProductOverview из ResumeAfter?   -  person user627289    schedule 02.06.2017


Ответы (1)


Во-первых, то, что вы пытаетесь сделать, невозможно.

Затем еще несколько вещей:

  • Вы не должны отправлять PostAsync после вызова Prompt.
  • Если вы хотите повторно использовать часть логики в методе LUIS Intent, вам необходимо извлечь эту логику в общий метод, который могут вызывать как LUIS, так и метод ResumeAfter приглашения. Конечно, этот общий метод не должен иметь ничего общего с LuisResult, поскольку он не будет доступен в методе ResumeAfter. Когда будет вызван метод ResumeAfter; LUIS не будет называться.
  • Если вы хотите, позвоните LUIS после приглашения, тогда нужно будет написать немного больше кода, но это выполнимо
  • Если вы просто хотите вызвать свой метод ProductOverview из метода ResumeAfter, вы можете просто сделать это как стандартный метод, однако (и снова) имейте в виду, что у вас не будет LuisResult там, поэтому вам придется отправить нулевое значение и обработайте его соответствующим образом в вашем ProductOverview методе.

Что-то вроде:

private async Task ProductChoice(IDialogContext context, IAwaitable<string> result)
    {

        PromptDialog.Choice<string>(
        context,
        AfterPromptChoiceMethod,
        this.productOptions,
        "Which plaform are you interested in?",
        "Ooops, what you wrote is not a valid option, please try again",
        3,
        PromptStyle.PerLine);
        await context.PostAsync(context.MakeMessage());
    }        

   private async Task AfterPromptChoiceMethod(IDialogContext context, IAwaitable<string> result)
    {
       await ProductOverview(context, null);
    }
person Ezequiel Jadib    schedule 02.06.2017