ABP入門系列(15)——創(chuàng)建微信公眾號模塊

ABP入門系列目錄——學(xué)習(xí)Abp框架之實(shí)操演練
源碼路徑:Github-LearningMpaAbp


1. 引言

現(xiàn)在的互聯(lián)網(wǎng)已不在僅僅局限于網(wǎng)頁應(yīng)用熊赖,IOS浪听、Android钉蒲、平板浓利、智能家居等平臺正如火如荼的迅速發(fā)展宫仗,移動應(yīng)用的需求也空前旺盛够挂。所有的互聯(lián)網(wǎng)公司都不想錯過這一次移動浪潮,布局移動市場分一份移動紅利藕夫。
的確孽糖,智能手機(jī)作為我們?nèi)粘I钜驯夭豢缮俚囊徊糠郑ㄟ^手機(jī)app能夠獲得更好的體驗(yàn)毅贮,比如社交办悟、購物、娛樂滩褥、生活病蛉。

但這也引入了一個問題,如果布局移動市場瑰煎,就意味著要維護(hù)好幾條產(chǎn)品線铺然,比如網(wǎng)頁、Android酒甸、IOS魄健、微信公眾號等。這對公司來說無疑是一項(xiàng)大的投入插勤。
產(chǎn)品對于用戶來說诀艰,用戶只關(guān)心體驗(yàn)。
而對于開發(fā)者來說饮六,開發(fā)者更關(guān)心在保證業(yè)務(wù)流程及數(shù)據(jù)的正確流轉(zhuǎn)下其垄,如何對產(chǎn)品線進(jìn)行集成,來避免做重復(fù)工作卤橄。

而恰好ABP框架就已經(jīng)幫我們解決了這一問題绿满,Abp是基于【模塊化設(shè)計(jì)思想】構(gòu)建的,開發(fā)人員可以將自定義的功能以模塊(module)的形式集成到ABP中窟扑。
不同的模塊通過組裝就可以組成一個新的功能喇颁。

那你肯定很好奇如何玩轉(zhuǎn)Abp模塊,下面我們就以我們的Demo為例嚎货,來進(jìn)行微信公眾號模塊的開發(fā)橘霎。

2. 創(chuàng)建微信公眾號模塊

定義一個模塊很簡單,只需創(chuàng)建微信項(xiàng)目殖属,然后定義WeixinModule類繼承自AbpModule即可姐叁,再然后為WeixinModule定義[DependsOn]特性指定依賴的模塊即可。

2.1. 創(chuàng)建微信公眾號項(xiàng)目

新建mvc項(xiàng)目,命名項(xiàng)目名為LearningMpaAbp.Weixin。因?yàn)橐褂玫紸bp定義的模塊功能,首先要安裝Abp Nuget包坝锰,選擇后會提示需要以下Nuget包,點(diǎn)擊確定安裝即可嘱吗。

安裝Abp需要依賴安裝的Nuget包

2.2. 定義微信公眾模塊

新建LearningMpaAbpWeixinModule繼承自AbpModule。代碼如下:

public class LearningMpaAbpWeixinModule:AbpModule
{
    /// <summary>
    /// 預(yù)初始化滔驾,通常是用來配置框架以及其它模塊
    /// </summary>
    public override void PreInitialize()
    {
        base.PreInitialize();
    }

    /// <summary>
    /// 初始化谒麦,一般用來依賴注入的注冊
    /// </summary>
    public override void Initialize()
    {
        //把當(dāng)前程序集的特定類或接口注冊到依賴注入容器中
        IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
    }

    /// <summary>
    /// 提交初始化,一般用來解析依賴關(guān)系
    /// </summary>
    public override void PostInitialize()
    {
        base.PostInitialize();
    }

    /// <summary>
    /// 應(yīng)用關(guān)閉時調(diào)用
    /// </summary>
    public override void Shutdown()
    {
        base.Shutdown();
    }
}

從代碼中可以看出主要包括四個重載方法哆致,每個重載方法負(fù)責(zé)不同的職責(zé)弄匕。

2.3. 指定依賴模塊

因?yàn)槲覀冃枰ㄟ^webapi與現(xiàn)有demo進(jìn)行交互,所以還需要安裝Abp.Web.Api Nuget包沽瞭。

安裝Abp.Web.Api需要依賴安裝的Nuget包

那怎樣指定依賴呢迁匠,只需要通過[DependsOn]特性指定即可。

[DependsOn(typeof(AbpWebApiModule))]
public class LearningMpaAbpWeixinModule:AbpModule
{
    //....
}

好了驹溃,一個微信公眾號模塊的基礎(chǔ)項(xiàng)目框架搭好了城丧,是不是很簡單!

到這一步豌鹤,你可能會問亡哄,你這只是簡單創(chuàng)建微信公眾號模塊,但如何與我們Demo進(jìn)行集成交互呢布疙?

對的蚊惯,是只簡單創(chuàng)建了微信模塊,但這一節(jié)我不打算講如何與Demo進(jìn)行集成交互灵临。因?yàn)樵诮榻B如何通過webapi與系統(tǒng)交互之前截型,梳理下Abp模塊化的設(shè)計(jì),更能幫助我們了解模塊化設(shè)計(jì)思想儒溉。

下面我們就簡單梳理下ABP模塊化的設(shè)計(jì)宦焦。

3. ABP模塊化設(shè)計(jì)

說到模塊,突然想到幾個單詞考考大家顿涣,model波闹、modal、module分別是什么意思涛碑?
不知道的就自行查詞典吧精堕。

下面回歸正題。

3.1. 模塊化相關(guān)類型

先來看看模塊相關(guān)類型依賴圖:

Module相關(guān)類型依賴圖

從類型依賴圖中可以看出設(shè)計(jì)的并不復(fù)雜:

  • AbpModule:所有定義的模塊均需繼承此抽象類蒲障。
  • AbpModuleInfo:可以理解為AbpModule的元數(shù)據(jù)歹篓,封裝AbpModule的基本信息瘫证,主要包括Assembly(所屬程序集)、Type(類型)滋捶、Dependencies(依賴的模塊)、IsLoadedAsPlugIn(是否插件模塊)余黎。
  • AbpModuleCollection:從類的申明:class AbpModuleCollection : List可知它是一個AbpModuleInfo的集合重窟。
  • AbpModuleManager:模塊管理類,主要用來進(jìn)行模塊管理惧财,比如啟動關(guān)閉模塊巡扇。
  • DependsOnAttribute:依賴特性,用來標(biāo)明模塊的依賴項(xiàng)垮衷。

3.2. Abp如何發(fā)現(xiàn)并加載模塊

Abp中定義了一個啟動類AbpBootstraper厅翔,該類的職責(zé)是啟動整個Abp系統(tǒng),主要負(fù)責(zé)依賴注入和注冊模塊以供啟動搀突。而該類必須在應(yīng)用程序啟動時最先被實(shí)例化刀闷。
而作為Abp生成的模板項(xiàng)目,啟動項(xiàng)目自然是web應(yīng)用仰迁,所以AbpBootstrapper肯定在Web項(xiàng)目中被初始化甸昏。眾所周知,web項(xiàng)目的啟動是從Global.asax文件的Application_Start項(xiàng)目開始的徐许。

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);
    }
}

我們先來觀察下類的申明施蜜,有沒有發(fā)現(xiàn)什么特別之處?
繼承的是泛型基類且指定的泛型為LearningMpaAbpWebModule雌隅,指定了一個Module翻默,當(dāng)前web項(xiàng)目的Moduel。
對MVC比較熟悉的同學(xué)應(yīng)該知道恰起,MVC應(yīng)用程序啟動類默認(rèn)是繼承自HttpApplication的修械。從該段代碼可以看出,Abp修改了MvcApplication的默認(rèn)繼承類检盼。那自然AbpWebApplication<T>是繼承自HttpApplication了祠肥。廢話不多說,來看一看具體的定義:

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();
  }
//省略了部分代碼
}

首先映入眼簾的是基類中定義的AbpBootstraper屬性梯皿,然后看到的是Application_StartApplication_End虛方法仇箱。
Application_Start方法中調(diào)用了AbpBootstrapper.Initialize()方法。相當(dāng)于AbpBootstrapper.Create<TStartupModule>().Initialize();

代碼是不是看累了东羹,上圖剂桥,咱們直接來看web項(xiàng)目啟動時Module動態(tài)加載的調(diào)用堆棧。

Module動態(tài)加載的調(diào)用堆棧

是不是一目了然属提,總結(jié)以下:

Abp在啟動項(xiàng)目時根據(jù)指定的啟動模塊(StartupModule)首先加載該模塊权逗,然后再去檢查該模塊的自定義特性是否定義有[DependsOn]特性美尸,若有則按序加載所有依賴的模塊,也就是鏈?zhǔn)絼討B(tài)依賴加載斟薇。然后再依次調(diào)用Module的PreInitialize师坎,Initialize和PostInitialize以完成初始化。

好了模塊的啟動加載就講到這里堪滨,感興趣的還是建議大家直接看看源碼胯陋。
這里推薦一篇文章ABP源碼分析三:ABP Module,來幫助大家理解Abp的模塊化思想袱箱。

4. 總結(jié)

這一節(jié)有點(diǎn)標(biāo)題黨的味道遏乔,但內(nèi)容也算點(diǎn)題了。下一篇我將介紹微信公眾號模塊如何通過WebApi與系統(tǒng)進(jìn)行交互发笔,盡情期待盟萨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市了讨,隨后出現(xiàn)的幾起案子捻激,更是在濱河造成了極大的恐慌,老刑警劉巖前计,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铺罢,死亡現(xiàn)場離奇詭異,居然都是意外死亡残炮,警方通過查閱死者的電腦和手機(jī)韭赘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來势就,“玉大人泉瞻,你說我怎么就攤上這事“耄” “怎么了袖牙?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長舅锄。 經(jīng)常有香客問我鞭达,道長,這世上最難降的妖魔是什么皇忿? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任畴蹭,我火速辦了婚禮,結(jié)果婚禮上鳍烁,老公的妹妹穿的比我還像新娘叨襟。我一直安慰自己,他們只是感情好幔荒,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布糊闽。 她就那樣靜靜地躺著梳玫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪右犹。 梳的紋絲不亂的頭發(fā)上提澎,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天,我揣著相機(jī)與錄音念链,去河邊找鬼盼忌。 笑死,一個胖子當(dāng)著我的面吹牛钓账,可吹牛的內(nèi)容都是我干的碴犬。 我是一名探鬼主播絮宁,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼梆暮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绍昂?” 一聲冷哼從身側(cè)響起啦粹,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎窘游,沒想到半個月后唠椭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡忍饰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年贪嫂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艾蓝。...
    茶點(diǎn)故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡力崇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赢织,到底是詐尸還是另有隱情亮靴,我是刑警寧澤,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布于置,位于F島的核電站茧吊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏八毯。R本人自食惡果不足惜搓侄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望话速。 院中可真熱鬧休讳,春花似錦、人聲如沸尿孔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至雏婶,卻和暖如春物赶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背留晚。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工酵紫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人错维。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓奖地,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赋焕。 傳聞我的和親對象是個殘疾皇子参歹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,348評論 25 707
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,871評論 6 342
  • 你都如何回憶我, 帶著笑隆判, 或是犬庇, 很沉默。 --劉若英《后來》
    曰舊白閱讀 223評論 0 0
  • 6月18日有幸聽了一場李善友教授的演講盛宴侨嘀,不是第一次聽聞第一性原理臭挽,卻是第一次感到震撼。 李善友教授開篇講第一性...
    楊楊xx閱讀 2,300評論 2 9
  • 初入這個行業(yè)咬腕,在工作中遇到了疑惑欢峰,便在網(wǎng)上翻譯了一篇歪果仁寫的文章:《為什么通向優(yōu)秀的設(shè)計(jì)的設(shè)計(jì)之路要承認(rèn)你是錯的...
    粒粒閱讀 460評論 0 3