Bot Framework の FormFlow で動的に Field を設定する方法

Bot FrameworkCognitive Services1歳の誕生日祝いに、Bot Framework の Tips を一つ紹介します。
※公式ドキュメントを読んでいれば書いてある内容ですが、気づいてなくて大分苦労しました・・・。

FormFlow を使うと、一連の質問を順番に問い合わせてくれるようなアプリケーションを作れます。公式ドキュメントだと、サンドウィッチの注文システムを例に紹介されていますね。(日本語で読みたい方は こちら


標準的な方法だと、各設問の回答の候補を enum で定義しておきます。これの問題は、ビルド時には回答が決まっている必要があることですが、実際には「他の Web サービスから得た値を回答の候補にしたい」なんてことはありそうです。

そんな時に使えるのが、FieldRefrector クラスです。動的に Field を定義して FormFlow に追加することができます。

[Serializable]
public class DynamicFieldForm
{
    public string Item;

    internal static IForm<DynamicFieldForm> BuildForm()
    {
        var form = new FormBuilder<DynamicFieldForm>()
            .Field(new FieldReflector<DynamicFieldForm>(nameof(Item))
                .SetType(null)
                .SetDefine((state, field) =>
                {
                    GetItems().ForEach(i => field.AddDescription(i, i).AddTerms(i, i));
                    return Task.FromResult(true);
                }))
            .Message("{Item} を選択しました")
            .Build();

        return form;
    }
}

SetType メソッドには null を渡すといいようです。(公式ドキュメントにも同じ呼び出し方が載っているので問題なさそう)

あとはSetDefine で回答リストを作成していきます。
ここで GetItems メソッドが動的な回答候補を IEnumerable で返しています。今回はサンプルということで固定の List ですが、実際にはここは RESTful なサービスから値をもらってくるなどの処理になるはず。

実行するとこんな風になります。

2017-04-02 23-53-26

念のため、呼び出し方と動的な回答候補の作り方も載せておきます。

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
    if (activity.Type == ActivityTypes.Message)
    {
        await Conversation.SendAsync(activity,
            () => Chain.From(() => FormDialog.FromForm(DynamicFieldForm.BuildForm)));
    }
    else
    {
        HandleSystemMessage(activity);
    }
    var response = Request.CreateResponse(HttpStatusCode.OK);
    return response;
}

private static IEnumerable<string> GetItems()
{
    return new List<string> { "項目1", "項目2", "項目3" };
}

この方法の問題点は、前の回答に応じて次の回答候補を決めることはできないこと。こういう時は ValidateResult を使うようですが、それはまた改めて。

今回は、ビジネスロジックによらずに回答候補を作成したい場合には FieldRefrector が使えるというお話でした。

広告
カテゴリー: Bot Framework, Cogbot タグ: , , パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中