从 MessageController 的 BuildForm 方法访问 LUIS 实体
Accessing LUIS entities from MessageController's BuildForm method
我正在尝试使用我使用 FormFlow 的 Microsoft Bot 框架版本 3 构建一个简单的 BOT。
用户输入的自由文本被发送到 returns 一些 intent/entity 的 LUIS。使用 LUIS 返回的实体,我需要从数据库中获取数据并在 BuildForm 方法中使用数据。
通过使用下面编写的代码,我能够从 LUIS 获取实体并从数据库中获取数据。
但是,我找不到任何方法在我的 BuildForm 方法中使用从数据库中获取的数据。
总结一下:
我想从 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;
....
}
您只需要在您的表单模型中设置值,在您的情况下 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);
我正在尝试使用我使用 FormFlow 的 Microsoft Bot 框架版本 3 构建一个简单的 BOT。 用户输入的自由文本被发送到 returns 一些 intent/entity 的 LUIS。使用 LUIS 返回的实体,我需要从数据库中获取数据并在 BuildForm 方法中使用数据。
通过使用下面编写的代码,我能够从 LUIS 获取实体并从数据库中获取数据。
但是,我找不到任何方法在我的 BuildForm 方法中使用从数据库中获取的数据。
总结一下: 我想从 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;
....
}
您只需要在您的表单模型中设置值,在您的情况下 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);