BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

Bot Builder v4 (4.0.1-preview) SDK のメモ: UseBotFramework() とか(2018-07版)

Bot Builder SDK v4 のサンプルコードを見ると、V3 までの仕組みとして存在した ASP.NET の Controller から...という実装が無くなっています。 じゃー ASP.NET Core で Middlewareでなんかやってるんだろなって想像はつきますが、気になったのでちょっと調べたメモです(めっちゃ自分向けメモ)。

f:id:beachside:20180712172514p:plain

Controller の実装がなくてもちゃんと動いている結論(?)は、ASP.NET Core の普通なパターンでも Middleware での実装によるものでした。Startup.cs で以下2つをしてます。

  • ConfigureServices メソッドで、AddBot<TBot> する
  • Configure メソッドで UseBotFramework する

で、なにしとんねんってメモを書いていきましょう。

AddBot でやってること

コードのまんまではありますが、主に以下をやっています。

  • AddBot<TBot> メソッドで受け取った Generics (TBot) をDI Container に登録
  • botFrameworkAdapter オブジェクト(BotAdapter)を生成

BotAdapter は、認証プロセスをカプセル化して、Bot Connector Service と Activity を送受信してくれる機能ですね。ユーザー側から Bot が Activity を受信すると、BotAdapter が context object を生成して Bot のアプリケーションロジックに渡し、処理した結果(Bot からの応答の文とか画像とか)をユーザー側に返すお仕事をしてくれる可愛い子です。その名の通り Adapter ♪

さっと見る限り、BotAdapter を独自に拡張してチャネルを広げるってのも容易にできそうですなぁ♪

UseBotFramework がやってること

Version 3までの Bot の開発でいつも書いていた ASP.NET の Controller 部分の実装は Middleware 側へ移りました。その実装部分が UseBotFramework 拡張メソッドです。

ここでやってることをざっくりいうと、
UseBotFramework の中で、 ルーティングのパス( api/messages) とアクションをマッピングしてるので、OnTurn を呼び出せてるって感じ。

BotProactiveMessageHandler の設定もしてるけど、興味ないから今はみないでおこう。

ルーティングのパスは BotFrameworkOptions の Path プロパティ(型は BotFrameworkPaths )のデフォルト値で api/messages が定義されてる。

.NET Core 用 の話だと(Core用じゃないのもあるのか...)、

ASP.NET Core のリクエスト pipeline で

BotMessageHandler クラスHandleAsync (つまりはBotMessageHandlerBase クラスHandleAsync )メソッド で context をいじって、 abstruct meshod ProcessMessageRequestAsyncOnTurnAsync を call してる感じ。

(7/4 の commit でメソッド名が OnTurn から OnTurnAsync に変更されてますが Nuget Package への反映はまだですね。このブログ書いてる時点の最新パッケージ Microsoft.Bot.Builder.Corev4.0.1-Preview では、メソッド名は まだ OnTurn ...この名称変更、修正は簡単だけど、既存へのインパクト100%....w)

あとはライブラリの実装で特筆したいことはなく目的は達成されたので、メモはこの辺までにしておきます。