Bot Builder SDK v4 のサンプルコードを見ると、V3 までの仕組みとして存在した ASP.NET の Controller から...という実装が無くなっています。 じゃー ASP.NET Core で Middlewareでなんかやってるんだろなって想像はつきますが、気になったのでちょっと調べたメモです(めっちゃ自分向けメモ)。
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 ProcessMessageRequestAsync
で OnTurnAsync
を call してる感じ。
(7/4 の commit でメソッド名が OnTurn
から OnTurnAsync
に変更されてますが Nuget Package への反映はまだですね。このブログ書いてる時点の最新パッケージ Microsoft.Bot.Builder.Core
のv4.0.1-Preview
では、メソッド名は まだ OnTurn
...この名称変更、修正は簡単だけど、既存へのインパクト100%....w)
あとはライブラリの実装で特筆したいことはなく目的は達成されたので、メモはこの辺までにしておきます。