クラウドAI開発講座進捗報告- 6週目
これの続き
作りたいものに向けてひたすらコーディング。
やったこと
やったことといってもひたすらコーディングなので今回は主に詰まったところについて各
1. BotHandler一回ごとに新しいインスタンスで処理されていた件
これ全然気づかなくてうーんってなってた。
サンプルのBotHandlerクラスの一つのインスタンスの各メソッドがActivityごとに呼び出されていると思ってた。
でも実際はイベントが発生するたびに新しいインスタンスが生成されそのインスタンス内のメソッドが呼び出されていた。つまり何が困るかというと下のようなコードがあったとき、
public class BotHandler : ActivityHandler
{
public int count =0;
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
count += 1;//messageを受け取ったときにcountを1増やす
Debug.WriteLine(count);//カウントを表示する
}
}
出力は
1
1
1
1
というように何度メッセージを受け取っても1から変化しない。
この原因は SampleのBotHandlerクラスが実はメッセージが読み込まれるたびに新しいインスタンスを生成していたからなのです(これ気付くまでめっちゃ時間かかった)
たぶん正しい解決法はDBにデータを保管しておくことだと思うんだけど絶対に面倒くさくてやりたくない、、、、
というわけでstaticパワーで力押しする作戦をとる。
クラスをstaticにするとインスタンスを作らなくても、値を呼び出したり更新したりできるのでBotHandlerが毎回新しいインスタンスで作られたとしても関係なく情報を保持できる。
コードで書くならまずcounterクラスみたいなクラスを適当に作って、
public static class Counter
{
private static int count = 0;
public static void addCountOne()
{
count += 1;
}
public static int getCount()
{
return count;
}
}
BotHandlerではstaticメソッドを呼び出すだけ
public class BotHandler : ActivityHandler
{
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
Counter.addCountOne(); //messageを受け取ったときにcountを1増やす
Debug.WriteLine(count);//コンソールにprint
}
出力は
1
2
3
4
みたいな感じなるはず!(実際に実行して確かめたわけじゃないので確かめてみてください)
それもめんどくさかったら一つ目のコードの
public int count =0;の部分をpublic static int count = 0にすればたぶん正しくカウントされる。これでもいいなって後で思いついたので追記。
2.ちょくちょく公式ドキュメント間違っている件
前から気になってたんですけどちょくちょく公式ドキュメント間違ってません?
例えばTranslatorの記事のこの部分。
あと何個かあったけどメモし忘れてた。
うーんという感じ。
感想
1. Teamsへのアップロードで面倒な工程はすべて終わったはずなので、あとはコーディングを進めるだけ!のはずなんだけど、teamsで画像アップできるのか若干怪しい
来週の予定
ひたすらコーディング、ある程度かけてきたらコード解説記事を書きたい。