Teams Bot开发系列:Activity处理流程
上篇文章介紹了什么是Activity,Turn,TurnContext和BotAdapter,這篇文章我們看看這些東西是如何竄起來的,他們是如何處理用戶發(fā)給bot的消息的。
我們以一個(gè)最簡(jiǎn)單的bot,echo bot為例子,所謂的echo bot就是用戶發(fā)什么消息,它就照樣回復(fù)一條消息。為了簡(jiǎn)單起見,大家可以先安裝VS2019的一個(gè)擴(kuò)展插件BotBuilderVSIX.vsix template,然后創(chuàng)建一個(gè)NET core 3.1的Echo bot。
?
可以看到這個(gè)模板為什么創(chuàng)建了一個(gè)項(xiàng)目,我們先到Startup.cs看一下:
// Create the Bot Framework Adapter with error handling enabled. services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithErrorHandler>();// Create the bot as a transient. In this case the ASP Controller is expecting an IBot. services.AddTransient<IBot, EchoBot>();可以看到DI了兩個(gè)類,值得注意的是,AdapterWithErrorHandler使用的是Singleton,而EchoBot使用的是Transient,如果大家不同模板來生成的話,這兩個(gè)千萬不能寫錯(cuò),不然會(huì)出意想不到的錯(cuò)誤,而且非常難查。
打開AdapterWithErrorHandler.cs文件,可以看到它從BotFrameworkHttpAdapter繼承下來。主要是提供了一些針對(duì)異常錯(cuò)誤的處理
public class AdapterWithErrorHandler : BotFrameworkHttpAdapter {public AdapterWithErrorHandler(IConfiguration configuration, ILogger<BotFrameworkHttpAdapter> logger): base(configuration, logger){OnTurnError = async (turnContext, exception) =>{...};} }從bot sdk的源代碼里,我可以知道?BotFrameworkHttpAdapter?一層層往上,最終到達(dá)?BotAdapter
public class BotFrameworkHttpAdapter : BotFrameworkHttpAdapterBase, IBotFrameworkHttpAdapter {... }public class BotFrameworkHttpAdapterBase : BotFrameworkAdapter, IStreamingActivityProcessor {... }public class BotFrameworkAdapter : BotAdapter, IAdapterIntegration, IExtendedUserTokenProvider, IConnectorClientBuilder {... }public abstract class BotAdapter {... }現(xiàn)在,我們結(jié)合下面這張圖來理解整個(gè)的處理過程。
?
可以看到我們的EchoBot從ActivityHandler繼承下來,我們查看一下SDK的源代碼,可以發(fā)現(xiàn):
public class ActivityHandler : IBot {public virtual async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken)){switch (turnContext.Activity.Type){case ActivityTypes.Message:await OnMessageActivityAsync(new DelegatingTurnContext<IMessageActivity>(turnContext), cancellationToken).ConfigureAwait(false);break;...}}protected virtual Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken){return Task.CompletedTask;}... }從上面sdk的源代碼就可以發(fā)現(xiàn)adapter調(diào)用了EchoBot的父類ActivityHandler的OnTurnAsync()方法,后者根據(jù)Activity的Type來調(diào)用到了EchoBot的OnMessageActivityAsync。
大家可以在?微軟botbuilder-dotnet repo?里找到上面的源代碼。
總結(jié)
以上是生活随笔為你收集整理的Teams Bot开发系列:Activity处理流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年1月29日 B站学习资料汇总
- 下一篇: Teams Bot开发系列:Teams的