ABP入门系列(15)——创建微信公众号模块
1. 引言
現(xiàn)在的互聯(lián)網(wǎng)已不在僅僅局限于網(wǎng)頁(yè)應(yīng)用,IOS、Android、平板、智能家居等平臺(tái)正如火如荼的迅速發(fā)展,移動(dòng)應(yīng)用的需求也空前旺盛。所有的互聯(lián)網(wǎng)公司都不想錯(cuò)過(guò)這一次移動(dòng)浪潮,布局移動(dòng)市場(chǎng)分一份移動(dòng)紅利。
的確,智能手機(jī)作為我們?nèi)粘I钜驯夭豢缮俚囊徊糠?#xff0c;通過(guò)手機(jī)app能夠獲得更好的體驗(yàn),比如社交、購(gòu)物、娛樂(lè)、生活。
但這也引入了一個(gè)問(wèn)題,如果布局移動(dòng)市場(chǎng),就意味著要維護(hù)好幾條產(chǎn)品線(xiàn),比如網(wǎng)頁(yè)、Android、IOS、微信公眾號(hào)等。這對(duì)公司來(lái)說(shuō)無(wú)疑是一項(xiàng)大的投入。
產(chǎn)品對(duì)于用戶(hù)來(lái)說(shuō),用戶(hù)只關(guān)心體驗(yàn)。
而對(duì)于開(kāi)發(fā)者來(lái)說(shuō),開(kāi)發(fā)者更關(guān)心在保證業(yè)務(wù)流程及數(shù)據(jù)的正確流轉(zhuǎn)下,如何對(duì)產(chǎn)品線(xiàn)進(jìn)行集成,來(lái)避免做重復(fù)工作。
而恰好ABP框架就已經(jīng)幫我們解決了這一問(wèn)題,Abp是基于【模塊化設(shè)計(jì)思想】構(gòu)建的,開(kāi)發(fā)人員可以將自定義的功能以模塊(module)的形式集成到ABP中。
不同的模塊通過(guò)組裝就可以組成一個(gè)新的功能。
那你肯定很好奇如何玩轉(zhuǎn)Abp模塊,下面我們就以我們的Demo為例,來(lái)進(jìn)行微信公眾號(hào)模塊的開(kāi)發(fā)。
2. 創(chuàng)建微信公眾號(hào)模塊
定義一個(gè)模塊很簡(jiǎn)單,只需創(chuàng)建微信項(xiàng)目,然后定義WeixinModule類(lèi)繼承自AbpModule即可,再然后為WeixinModule定義[DependsOn]特性指定依賴(lài)的模塊即可。
2.1. 創(chuàng)建微信公眾號(hào)項(xiàng)目
新建mvc項(xiàng)目,命名項(xiàng)目名為L(zhǎng)earningMpaAbp.Weixin。因?yàn)橐褂玫紸bp定義的模塊功能,首先要安裝Abp Nuget包,選擇后會(huì)提示需要以下Nuget包,點(diǎn)擊確定安裝即可。
安裝Abp需要依賴(lài)安裝的Nuget包
2.2. 定義微信公眾模塊
新建LearningMpaAbpWeixinModule繼承自AbpModule。代碼如下:
?
public class LearningMpaAbpWeixinModule:AbpModule {/// <summary>/// 預(yù)初始化,通常是用來(lái)配置框架以及其它模塊/// </summary>public override void PreInitialize(){base.PreInitialize();}/// <summary>/// 初始化,一般用來(lái)依賴(lài)注入的注冊(cè)/// </summary>public override void Initialize(){//把當(dāng)前程序集的特定類(lèi)或接口注冊(cè)到依賴(lài)注入容器中IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());}/// <summary>/// 提交初始化,一般用來(lái)解析依賴(lài)關(guān)系/// </summary>public override void PostInitialize(){base.PostInitialize();}/// <summary>/// 應(yīng)用關(guān)閉時(shí)調(diào)用/// </summary>public override void Shutdown(){base.Shutdown();} }從代碼中可以看出主要包括四個(gè)重載方法,每個(gè)重載方法負(fù)責(zé)不同的職責(zé)。
2.3. 指定依賴(lài)模塊
因?yàn)槲覀冃枰ㄟ^(guò)webapi與現(xiàn)有demo進(jìn)行交互,所以還需要安裝Abp.Web.Api Nuget包。
安裝Abp.Web.Api需要依賴(lài)安裝的Nuget包
那怎樣指定依賴(lài)呢,只需要通過(guò)[DependsOn]特性指定即可。
?
[DependsOn(typeof(AbpWebApiModule))] public class LearningMpaAbpWeixinModule:AbpModule {//.... }好了,一個(gè)微信公眾號(hào)模塊的基礎(chǔ)項(xiàng)目框架搭好了,是不是很簡(jiǎn)單!
到這一步,你可能會(huì)問(wèn),你這只是簡(jiǎn)單創(chuàng)建微信公眾號(hào)模塊,但如何與我們Demo進(jìn)行集成交互呢?
對(duì)的,是只簡(jiǎn)單創(chuàng)建了微信模塊,但這一節(jié)我不打算講如何與Demo進(jìn)行集成交互。因?yàn)樵诮榻B如何通過(guò)webapi與系統(tǒng)交互之前,梳理下Abp模塊化的設(shè)計(jì),更能幫助我們了解模塊化設(shè)計(jì)思想。
下面我們就簡(jiǎn)單梳理下ABP模塊化的設(shè)計(jì)。
3. ABP模塊化設(shè)計(jì)
說(shuō)到模塊,突然想到幾個(gè)單詞考考大家,model、modal、module分別是什么意思?
不知道的就自行查詞典吧。
下面回歸正題。
3.1. 模塊化相關(guān)類(lèi)型
先來(lái)看看模塊相關(guān)類(lèi)型依賴(lài)圖:
Module相關(guān)類(lèi)型依賴(lài)圖
從類(lèi)型依賴(lài)圖中可以看出設(shè)計(jì)的并不復(fù)雜:
- AbpModule:所有定義的模塊均需繼承此抽象類(lèi)。
- AbpModuleInfo:可以理解為AbpModule的元數(shù)據(jù),封裝AbpModule的基本信息,主要包括Assembly(所屬程序集)、Type(類(lèi)型)、Dependencies(依賴(lài)的模塊)、IsLoadedAsPlugIn(是否插件模塊)。
- AbpModuleCollection:從類(lèi)的申明:class AbpModuleCollection : List可知它是一個(gè)AbpModuleInfo的集合。
- AbpModuleManager:模塊管理類(lèi),主要用來(lái)進(jìn)行模塊管理,比如啟動(dòng)關(guān)閉模塊。
- DependsOnAttribute:依賴(lài)特性,用來(lái)標(biāo)明模塊的依賴(lài)項(xiàng)。
3.2. Abp如何發(fā)現(xiàn)并加載模塊
Abp中定義了一個(gè)啟動(dòng)類(lèi)AbpBootstraper,該類(lèi)的職責(zé)是啟動(dòng)整個(gè)Abp系統(tǒng),主要負(fù)責(zé)依賴(lài)注入和注冊(cè)模塊以供啟動(dòng)。而該類(lèi)必須在應(yīng)用程序啟動(dòng)時(shí)最先被實(shí)例化。
而作為Abp生成的模板項(xiàng)目,啟動(dòng)項(xiàng)目自然是web應(yīng)用,所以AbpBootstrapper肯定在Web項(xiàng)目中被初始化。眾所周知,web項(xiàng)目的啟動(dòng)是從Global.asax文件的Application_Start項(xiàng)目開(kāi)始的。
?
public class MvcApplication : AbpWebApplication<LearningMpaAbpWebModule> {protected override void Application_Start(object sender, EventArgs e){AbpBootstrapper.IocManager.IocContainer.AddFacility<LoggingFacility>(f => f.UseAbpLog4Net().WithConfig("log4net.config"));base.Application_Start(sender, e);} }我們先來(lái)觀察下類(lèi)的申明,有沒(méi)有發(fā)現(xiàn)什么特別之處?
繼承的是泛型基類(lèi)且指定的泛型為L(zhǎng)earningMpaAbpWebModule,指定了一個(gè)Module,當(dāng)前web項(xiàng)目的Moduel。
對(duì)MVC比較熟悉的同學(xué)應(yīng)該知道,MVC應(yīng)用程序啟動(dòng)類(lèi)默認(rèn)是繼承自HttpApplication的。從該段代碼可以看出,Abp修改了MvcApplication的默認(rèn)繼承類(lèi)。那自然AbpWebApplication<T>是繼承自HttpApplication了。廢話(huà)不多說(shuō),來(lái)看一看具體的定義:
?
public abstract class AbpWebApplication<TStartupModule> : HttpApplication where TStartupModule : AbpModule {/// <summary>/// Gets a reference to the <see cref="P:Abp.Web.AbpWebApplication`1.AbpBootstrapper" /> instance./// </summary>public static AbpBootstrapper AbpBootstrapper { get; } = AbpBootstrapper.Create<TStartupModule>();/// <summary>/// This method is called by ASP.NET system on web application's startup./// </summary>protected virtual void Application_Start(object sender, EventArgs e){ThreadCultureSanitizer.Sanitize();AbpWebApplication<TStartupModule>.AbpBootstrapper.Initialize();}/// <summary>/// This method is called by ASP.NET system on web application shutdown./// </summary>protected virtual void Application_End(object sender, EventArgs e){AbpWebApplication<TStartupModule>.AbpBootstrapper.Dispose();} //省略了部分代碼 }首先映入眼簾的是基類(lèi)中定義的AbpBootstraper屬性,然后看到的是Application_Start和Application_End虛方法。
Application_Start方法中調(diào)用了AbpBootstrapper.Initialize()方法。相當(dāng)于AbpBootstrapper.Create<TStartupModule>().Initialize();
代碼是不是看累了,上圖,咱們直接來(lái)看web項(xiàng)目啟動(dòng)時(shí)Module動(dòng)態(tài)加載的調(diào)用堆棧。
Module動(dòng)態(tài)加載的調(diào)用堆棧
是不是一目了然,總結(jié)以下:
Abp在啟動(dòng)項(xiàng)目時(shí)根據(jù)指定的啟動(dòng)模塊(StartupModule)首先加載該模塊,然后再去檢查該模塊的自定義特性是否定義有[DependsOn]特性,若有則按序加載所有依賴(lài)的模塊,也就是鏈?zhǔn)絼?dòng)態(tài)依賴(lài)加載。然后再依次調(diào)用Module的PreInitialize,Initialize和PostInitialize以完成初始化。
好了模塊的啟動(dòng)加載就講到這里,感興趣的還是建議大家直接看看源碼。
這里推薦一篇文章ABP源碼分析三:ABP Module,來(lái)幫助大家理解Abp的模塊化思想。
4. 總結(jié)
這一節(jié)有點(diǎn)標(biāo)題黨的味道,但內(nèi)容也算點(diǎn)題了。下一篇我將介紹微信公眾號(hào)模塊如何通過(guò)WebApi與系統(tǒng)進(jìn)行交互,盡情期待。
作者:圣杰
鏈接:https://www.jianshu.com/p/1e6efd9be629
來(lái)源:簡(jiǎn)書(shū)
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
總結(jié)
以上是生活随笔為你收集整理的ABP入门系列(15)——创建微信公众号模块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 打一棒再给个枣?马斯克发电子邮件赞扬特斯
- 下一篇: 核酸过期3分钟被拒登机 东航回应引争议: