2017-02-16 4 views
0

У меня есть диалог корень, LuisDialog, из которого я называю несколько дочерних диалоговых окон, как следуетPass LuisResult ребенку диалоговое

[LuisModel("8869ccea-7c5f-4cce-8639-64bbc7ecd62b", "c5835534ed7746449356c62dcdf48fde")] 
[Serializable] 
public class DefaultDialog : LuisDialog<object> 
{ 

    [LuisIntent("showIncidents")] 
    public async Task ShowIncidents(IDialogContext context, IAwaitable<IMessageActivity> _message, LuisResult result) 
    { 
     var message = await _message; 
     await context.Forward(new ShowIncident(), ResumeAfter,message,CancellationToken.None); 
    } 

    [LuisIntent("CreateIncident")] 
    public async Task CreateIncident(IDialogContext context, LuisResult result) 
    { 
     //context.Call(new CreateIncident(), ResumeAfter); 
     context.Call(new CreateIncident(), ResumeAfter); 
    } 

Когда я называю «ShowIncident()» dialiog, я хотел бы перенаправить LuisResult, а не сообщение, потому что мне нужны сущности из LuisResult в дочернем диалоге. Таким образом, я пытался вызова диалога ребенка с помощью следующего кода:

await context.Forward(new ShowIncident(), ResumeAfter,result,CancellationToken.None); 

Я попытался реализации моего «ShowIncident» диалог следующим образом:

[Serializable] 
public class ShowIncident : IDialog<object> 
{ 
    public async Task StartAsync(IDialogContext context) 
    { 
     context.Wait(MessageReceivedAsync); 
    } 

    public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<LuisResult> _result) 
    { 
     var result = await _result; 
     // Get and post Incidents 
     Incidents incidents = await ServiceNow.GetIncidentsAsync(); 
     await context.PostAsync(incidents.toText()); 
    } 
} 

Это выдает ошибку, которую я предполагаю, потому что IAwaitable<LuisResult> должен be IAwaitable<IMessageActivity>. Я понимаю, что могу использовать несколько обходных решений, например, позиционирование сущностей в виде сообщения или использование общедоступного статического класса для определения инцидентов. Но каков был бы «правильный путь»?

ответ

2

Добавьте конструктор CreateIncident

public class ShowIncident : IDialog<object> 
{ 
     private LuisResult _luisResult; 
     public ShowIncident(LuisResult luisResult) 
     { 
     _luisResult = _luisResult; 
     } 

     public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> activity) 
     { //.... 

и назвать его, как этот context.Call (новый CreateIncident(result), ResumeAfter);

Смежные вопросы