从MessageController的BuildForm方法访问LUIS实体

时间:2016-12-11 08:27:02

标签: c# botframework luis

我正在尝试使用Microsoft软件Bot框架版本3构建一个简单的BOT,我正在使用FormFlow。 用户输入的自由文本被发送到LUIS,LUIS返回一些意图/实体。使用LUIS返回的实体我需要从数据库中获取数据并使用BuildForm方法中的数据。

通过使用下面编写的代码,我可以从LUIS获取实体并从数据库中获取数据。

但是,我找不到任何方法来使用我的BuildForm方法中从DB获取的数据。

总结一下: 我想从MessageController的BuildForm方法访问LuisDialog方法中提取的数据。

任何帮助都将受到高度赞赏。

**MessageController**
public virtual async Task<HttpResponseMessage> Post([FromBody] Activity activity)
{
    ......
    await Conversation.SendAsync(activity, MakeRoot);
}
internal static IDialog<TestRequest> MakeRoot()
{
    return Chain.From(() => new TestDialog(BuildForm));
}

private static IForm<TestRequest> BuildForm()
{
    return builder.Message("")
            .Field(nameof(TestRequest.searchResult))
            .Build
}

**LUISDialog:**
class TestDialog : LuisDialog<TestRequest>
{
    [LuisIntent("testIntent")]
    public async Task GetTestIntentForm(IDialogContext context, LuisResult result)
    {
        // Pass the intent & entity to DBAccess class which returns list of string
        List<string> lstResult = DBAccess.getInfoFromDB("testIntent", entities);

        IDialog<TestRequest> testForm = new FormDialog<TestRequest>(new  TestRequest(), this.MakeTestForm, FormOptions.PromptInStart, entities);

        context.Call<TestRequest>(testForm, TestFormComplete);
    }
}
**TestRequest**
[Serializable]
class TestRequest
{
    [Prompt("This is the search result")]
    public string searchResult;
....
}

1 个答案:

答案 0 :(得分:2)

您只需在表单模型中设置值TestRequest。所以不要这样做:

IDialog<TestRequest> testForm = new FormDialog<TestRequest>(new TestRequest(), this.MakeTestForm, FormOptions.PromptInStart, entities);

你可以做到

IDialog<TestRequest> testForm = new FormDialog<TestRequest>(new TestRequest { searchResult = lstResult }, this.MakeTestForm, FormOptions.PromptInStart, entities);