ABP入門系列目錄——學習Abp框架之實操演練
源碼路徑:Github-LearningMpaAbphtml
如今的互聯網已不在僅僅侷限於網頁應用,IOS、Android、平板、智能家居等平臺正如火如荼的迅速發展,移動應用的需求也空前旺盛。全部的互聯網公司都不想錯過這一次移動浪潮,佈局移動市場分一份移動紅利。
的確,智能手機做爲咱們平常生活已必不可少的一部分,經過手機app可以得到更好的體驗,好比社交、購物、娛樂、生活。git
但這也引入了一個問題,若是佈局移動市場,就意味着要維護好幾條產品線,好比網頁、Android、IOS、微信公衆號等。這對公司來講無疑是一項大的投入。
產品對於用戶來講,用戶只關心體驗。
而對於開發者來講,開發者更關心在保證業務流程及數據的正確流轉下,如何對產品線進行集成,來避免作重複工做。github
而剛好ABP框架就已經幫咱們解決了這一問題,Abp是基於【模塊化設計思想】構建的,開發人員能夠將自定義的功能以模塊(module)的形式集成到ABP中。
不一樣的模塊經過組裝就能夠組成一個新的功能。web
那你確定很好奇如何玩轉Abp模塊,下面咱們就以咱們的Demo爲例,來進行微信公衆號模塊的開發。api
定義一個模塊很簡單,只需建立微信項目,而後定義WeixinModule類繼承自AbpModule便可,再而後爲WeixinModule定義[DependsOn]特性指定依賴的模塊便可。微信
新建mvc項目,命名項目名爲LearningMpaAbp.Weixin。由於要使用到Abp定義的模塊功能,首先要安裝Abp Nuget包,選擇後會提示須要如下Nuget包,點擊肯定安裝便可。mvc
新建LearningMpaAbpWeixinModule繼承自AbpModule。代碼以下:app
public class LearningMpaAbpWeixinModule:AbpModule { /// <summary> /// 預初始化,一般是用來配置框架以及其它模塊 /// </summary> public override void PreInitialize() { base.PreInitialize(); } /// <summary> /// 初始化,通常用來依賴注入的註冊 /// </summary> public override void Initialize() { //把當前程序集的特定類或接口註冊到依賴注入容器中 IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); } /// <summary> /// 提交初始化,通常用來解析依賴關係 /// </summary> public override void PostInitialize() { base.PostInitialize(); } /// <summary> /// 應用關閉時調用 /// </summary> public override void Shutdown() { base.Shutdown(); } }
從代碼中能夠看出主要包括四個重載方法,每一個重載方法負責不一樣的職責。框架
由於咱們須要經過webapi與現有demo進行交互,因此還須要安裝Abp.Web.Api Nuget包。ide
那怎樣指定依賴呢,只須要經過[DependsOn]特性指定便可。
[DependsOn(typeof(AbpWebApiModule))] public class LearningMpaAbpWeixinModule:AbpModule { //.... }
好了,一個微信公衆號模塊的基礎項目框架搭好了,是否是很簡單!
到這一步,你可能會問,你這只是簡單建立微信公衆號模塊,但如何與咱們Demo進行集成交互呢?
對的,是隻簡單建立了微信模塊,但這一節我不打算講如何與Demo進行集成交互。由於在介紹如何經過webapi與系統交互以前,梳理下Abp模塊化的設計,更能幫助咱們瞭解模塊化設計思想。
下面咱們就簡單梳理下ABP模塊化的設計。
說到模塊,忽然想到幾個單詞考考你們,model、modal、module分別是什麼意思?
不知道的就自行查詞典吧。
下面迴歸正題。
先來看看模塊相關類型依賴圖:
從類型依賴圖中能夠看出設計的並不複雜:
class AbpModuleCollection : List
可知它是一個AbpModuleInfo的集合。Abp中定義了一個啓動類AbpBootstraper
,該類的職責是啓動整個Abp系統,主要負責依賴注入和註冊模塊以供啓動。而該類必須在應用程序啓動時最早被實例化。
而做爲Abp生成的模板項目,啓動項目天然是web應用,因此AbpBootstrapper
確定在Web項目中被初始化。衆所周知,web項目的啓動是從Global.asax文件的Application_Start
項目開始的。
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); } }
咱們先來觀察下類的申明,有沒有發現什麼特別之處?
繼承的是泛型基類且指定的泛型爲LearningMpaAbpWebModule
,指定了一個Module,當前web項目的Moduel。
對MVC比較熟悉的同窗應該知道,MVC應用程序啓動類默認是繼承自HttpApplication
的。從該段代碼能夠看出,Abp修改了MvcApplication
的默認繼承類。那天然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_Start
和Application_End
虛方法。
Application_Start
方法中調用了AbpBootstrapper.Initialize()
方法。至關於AbpBootstrapper.Create<TStartupModule>().Initialize();
代碼是否是看累了,上圖,我們直接來看web項目啓動時Module動態加載的調用堆棧。
是否是一目瞭然,總結如下:
Abp在啓動項目時根據指定的啓動模塊(StartupModule)首先加載該模塊,而後再去檢查該模塊的自定義特性是否認義有[DependsOn]特性,如有則按序加載全部依賴的模塊,也就是鏈式動態依賴加載。而後再依次調用Module的PreInitialize,Initialize和PostInitialize以完成初始化。
好了模塊的啓動加載就講到這裏,感興趣的仍是建議你們直接看看源碼。
這裏推薦一篇文章ABP源碼分析三:ABP Module,來幫助你們理解Abp的模塊化思想。
這一節有點標題黨的味道,但內容也算點題了。下一篇我將介紹微信公衆號模塊如何經過WebApi與系統進行交互,盡情期待。