MS Bot, как перенаправить объекты Luis в дочерний диалог

Я пытаюсь перенаправить Entities из LuisResults в дочерний диалоговый класс. Может ли кто-нибудь помочь в том, как это сделать?

Диалоговый класс Луиса

...
[LuisIntent("Foo")]
public async Task Foo(IDialogContext context, LuisResult result)
{
    var entities = result.Entities;
    await context.Forward(new FooDialog(), AfterFooDialog, entities, 
    CancellationToken.None);
}
...

Класс Фуддиалог

...
public async StartAsync(IDialogContext context)
{
    context.Wait(MessageReceivedAsync);
}

private async Task MessageReceivedAsync(IDialogContext context, List<string> entities, IAwaitable(IMessageActivity) result)
{
    var _entites = await entities;
    ...

}
...

person Adam    schedule 18.04.2018    source источник


Ответы (1)


Один из подходов к этому заключается в том, что вы инициализируете объекты в конструкторе FooDialog через. Поэтому передайте сущности FooDialog в конструкторе, пересылая их из LuisDialog.

Таким образом, ваш код будет:

Диалог Луиса

[LuisIntent("Foo")]
    public async Task Foo(IDialogContext context, LuisResult result)
    {
        var entities = result.Entities;
        await context.Forward(new FooDialog(entities), AfterFooDialog, entities, CancellationToken.None);
    }

И ваш FooDialog

[Serializable]
public class FooDialog : IDialog<object>
{
    public IList<EntityRecommendation> _entities { get; set; }

    public FooDialog(IList<EntityRecommendation> entities)
    {
        this._entities = entities;
    }

    public FooDialog()
    {}

    public async Task StartAsync(IDialogContext context)
    {
        context.Wait(this.MessageReceivedAsync);
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result )
    {
        await context.PostAsync("Entity : " + _entities.First().Entity);
    }

}

Итак, теперь у вас есть сущности внутри класса FooDialog, доступные любой функции внутри объекта.

person Ashwin Kumar    schedule 18.04.2018
comment
Спасибо @Ashwin, это сработало хорошо. Обратите внимание, что мне не понадобился пустой public FooDialog() { } - person Adam; 19.04.2018
comment
Причина добавления этого конструктора заключалась в том, что на более поздних этапах, если вы захотите вызвать FooDialog без сущностей, это будет возможно. Так что все зависит от того, как вы хотите его спроектировать. - person Ashwin Kumar; 19.04.2018
comment
Привет, Эшвин, я сделал то же самое, но в MessageReceivedAsync я написал PromptDialog.Confirm, и в его обработчике возобновления я извлекаю сущности luis, но после PromptDialog.Confirm я получаю this._entities как null.. - person Amol Pawar; 22.06.2018