2017-04-11 3 views
-1

현재 IDialogContext 인스턴스를 재설정하거나 종료 (context.Done 사용)하고 새 인스턴스를 만들고 다른 기능에서 사용해야 할 필요가 있습니다. 인터페이스 인 IDialogContext와 같은 인스턴스를 어떻게 만들 수 있습니까? 가능한가? Microsoft Bot Framework에서 새 IDialogContext 인스턴스를 만드는 방법은 무엇입니까?

오전 함수 "selfredirect"

private async Task ApprovalConfirm(IDialogContext context, IAwaitable<IMessageActivity> result) 
{ 
var message = await result; 
xxxticket xxxticketobject = new xxxticket(); 
if (message.Text.Contains("yes")) 
{ 
    xxxticketobject = context.ConversationData.Get<xxxticket>("xxxcard"); 
    if (xxxticketobject.action == "Approve") 
     await context.PostAsync("Accepted"); 
    else 
     await context.PostAsync("Rejected"); 
    context.ConversationData.RemoveValue("xxxfinalcard"); 
    context.Reset();// *This is what I want to do...clear context and then call the following function* 
    await SelfRedirect(context, context.UserData.Get<string>("CurrentQuery"), "Approval"); 
} 
else if (message.Text == "no") 
{ 
    await context.PostAsync("Thank you"); 
    context.Done(context); 
} 
else 
    await SelfRedirect(context, context.UserData.Get<string>("CurrentQuery"), null); 

}

selfredirect 기능

public static async Task SelfRedirect(IDialogContext context, string msg, string intent=null) 
    { 
     try 
     { 
      DialogLuis LUISDialog = new DialogLuis(); 
      IMessageActivity message = context.MakeMessage(); 
      message.Text = msg; 
      var tasks = LUISDialog.services.Select(s => s.QueryAsync(message.Text, context.CancellationToken)).ToArray(); 
      var results = await Task.WhenAll(tasks); 
      var winners = from result in results.Select((value, index) => new { value, index }) 
          let resultWinner = LUISDialog.BestIntentFrom(result.value) 
          where resultWinner != null 
          select new LuisServiceResult(result.value, resultWinner, LUISDialog.services[result.index]); 
      if (intent != null) 
      { 
       winners = from result in results.Select((value, index) => new { value, index }) 
          let resultWinner = new IntentRecommendation(intent) 
          where resultWinner != null 
          select new LuisServiceResult(result.value, resultWinner, LUISDialog.services[result.index]); 
      } 
      var winner = LUISDialog.BestResultFrom(winners); 
      if (winner == null) 
      { 
       throw new InvalidOperationException("No winning intent selected from Luis results."); 
      } 
      if (winner.Result.Dialog?.Status == DialogResponse.DialogStatus.Question) 
      { 
       var childDialog = await LUISDialog.MakeLuisActionDialog(winner.LuisService, 
                  winner.Result.Dialog.ContextId, 
                  winner.Result.Dialog.Prompt); 
       context.Call(childDialog, LUISDialog.LuisActionDialogFinished); 
      } 
      else 
      { 
       IAwaitable<IMessageActivity> item = null; 
       await LUISDialog.DispatchToIntentHandler(context, item, winner.BestIntent, winner.Result); 
      } 
     } 
     catch (Exception ex) { CommonMethods.LogTime("", ex, context); } 
    } 

전화를 시도되는 기능입니다하지만 난을 사용하지 못할 스택이 비어있을 때 재설정 후 기능을 리디렉션합니다. 내가

private async Task ApprovalConfirm(IDialogContext context, IAwaitable<IMessageActivity> result) 
    { 
     var message = await result; 
     if (message.Text == "no") 
     { 
      await context.PostAsync("Thank you"); 
      context.Done(context); 
     } 
     else if (message.Text == "yes") 
     { 
      await context.PostAsync("yes"); 
      context.Done(context); 
     } 
     else 
     { 
      context.Wait(MessageReceived); 
     } 
    } 

내 사용 사례처럼이 작은 기능을 대신 context.wait의 selfredirect 기능 (MessageReceived)을 사용했다 왜

이 경우 사용자 유형 예 다음 봇해야, 내가 자세히 설명하자 도와주세요 return yes, 사용자가 no를 입력하면 bot은 고맙습니다. 사용자가 "Hi"를 입력하면 봇은 새로운 Greeting intent에 도달하여 Hi 사용자를 반환 할 Luis를 통해 Hi에 대한 답을 찾아야합니다. 여기

I 사용자 context.Wait (MessageReceived는) 다음 봇은 단순히 사용자

대화 상자의 구조에서 다음 쿼리를 기다릴 것인지!

[LuisIntent("Approval")] 
    public async Task Approval(IDialogContext context, LuisResult result) 
    { 
     context.ConversationData.SetValue("currentIntent", "Approval"); 
     . 
     . 
     . 
     PromptDialog.Choice<string>(context, ApprovalList, ...); 
    } 


private async Task ApprovalList(IDialogContext context, IAwaitable<string> result) 
    { 
     try 
     { 
      var request_type = await result; 
      . 
      . 
      context.Wait(ApprovalResponse); 
      } 
     } 
     catch (Exception ex) 
     { 
      CommonMethods.LogTime("ApprovalList", ex, context); 
     } 
    } 
private async Task ApprovalResponse(IDialogContext context, IAwaitable<IMessageActivity> result) 
    { 
     var message = await result; 
     . 
     . 
     . 
      context.Wait(AfterApprovalComment); 
     } 
     catch (Exception ex) 
     { 
      CommonMethods.LogTime("ApprovalResponse", ex, context); 
      await context.PostAsync("out of approvals..."); 
      context.Done(context); 
     } 
    } 


private async Task ApprovalConfirm(IDialogContext context, IAwaitable<IMessageActivity> result) 
    { 
     var message = await result; 
     . 
     . 
     . 
    await SelfRedirect(context, context.UserData.Get<string>("CurrentQuery"), "Approval"); 
    } 
+0

현재 함수에서 인스턴스를 생성하고 싶습니다. 여러 대화 상자를 처리하고 있기 때문에 그 끝에서 Idialogcontext 인스턴스도 기대하는 다른 함수로 리디렉션해야합니다. –

+0

코드를 표시하십시오. 그렇지 않으면 수행하려는 작업을 이해하기가 정말로 어렵습니다. –

+0

@EzequielJadib 안녕하세요. 코드를 추가했습니다 .. :) –

답변

0

더 많은 요구 사항을 이해하는 데 도움이되는 의견을 토대로 스택을 재설정 할 필요가없는 것으로 보입니다.

대신에 사용자가 상속하는 LuisDialogMessageReceived 방법을 활용하면됩니다. 이를 통해 메서드를 직접 호출하여 LUIS으로 이동하여 사용자의 새로운 입력이 필요없이 새로운 의도를 해결할 수 있습니다.

해당 메서드를 호출하는 것은 다른 호출 메서드와 완전히 동일합니다. 유일한주의 사항은 MessageReceived 메서드가 IAwaitable<IMessageActivity>을 기다리고 있기 때문에 생성해야한다는 것입니다. 좋은 소식은 사용하기 쉽다는 것입니다. Awaitable.FromItem