2017-06-02 51 views
0

我使用的類是Microsoft.Bot.Builder.Dialog.Promptoptions,它需要一個ResumeAfter,它是委託並需要(IDialogContext上下文,IAwaitable結果)我很難隱藏一個IAwaitable到LuisResult(微軟Bot框架上的LUIS)

不過,我想打電話給該委託是不是 私人異步任務測試(IDialogContext背景下,IAwaitable結果)

而是具有以下

[LuisIntent一個LUIS委託(」測試「) 私人異步

這將不勝感激聽到一些想法如何調用LUIS任務測試(IDialogContext背景下,LuisResult結果)歸因方法

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"); 
     } 
    } 
+2

你需要表現出更多的代碼。你如何使用PromptOptions,你爲什麼期望'LuisResult'返回到你的回調? – Evk

+1

您可能需要重構一些代碼,並將您的測試方法中的內容提取爲Luis結果和ResumeAfter使用的常用方法。 –

+0

您將無法做到這一點。但重構代碼會更容易,使用一個通用的方法。 –

回答

2

首先,你正在嘗試做的是不可能。

然後一些其他的東西:

  • 調用Prompt後,您不應該發送PostAsync
  • 如果您想重用LUIS Intent方法中的某些邏輯,那麼您需要將該邏輯解壓縮爲LUIS和提示的ResumeAfter方法都可以調用的常用方法。當然,這種常用方法不應該包含任何與LuisResult相關的內容,因爲在ResumeAfter方法中不可用。當ResumeAfter方法被調用時; LUIS不會被調用。
  • 如果你想要的是,調用LUIS後的提示,則更多的代碼將被寫入,但它是可行的
  • 如果你只是想從ResumeAfter方法調用你ProductOverview方法,你可以這樣做它作爲一種標準方法,然而(並且再次)記住,你不會在那裏有一個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); 
    }