2017-06-02 8 views
0

私はdelegateでResumeAfterを必要とする(IDialogContextコンテキスト、IAwaitable結果)Microsoft.Bot.Builder.Dialog.Promptoptionsクラスを使用しています私はIAwaitableをLuisResult(Microsoft BotフレームワークのLUIS)に変換しようとしています

しかし、私は呼びたいデリゲートは、「(ないタスクテスト(IDialogContextコンテキスト、IAwaitable結果)

が、以下の

[LuisIntentを持っているというLUISデリゲートの非同期プライベート のですテスト ") タスクテスト(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"); 
     } 
    } 
+2

。そのPromptOptionsの使い方は、なぜ 'LuisResult'があなたのコールバックに返されると思いますか? – Evk

+1

いくつかのコードのリファクタリングと抽出が必要な場合があります.Luis resultとResumeAfterで使用される一般的な方法にTestメソッドで行われた内容を抽出します –

+0

これを行うことはできません。しかし、コードをリファクタリングする方が簡単ですが、一般的な方法を使用してください。 –

答えて

2

まず、あるの帰属呼び出す方法をいくつかの考えを聞いて理解されるであろうありえない。その後

いくつか他のもの:

  • あなたはPromptを呼び出した後PostAsyncを送るべきではありません。
  • LUISインテントメソッドでロジックの一部を再利用する場合は、そのロジックを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); 
    } 
関連する問題