ABP原始碼分析二:ABP中配置的註冊和初始化
一般來說,ASP.NET Web應用程式的第一個執行的方法是Global.asax下定義的Start方法。執行這個方法前HttpApplication 例項必須存在,也就是說其建構函式的執行必然是完成了。 ABP開始的地方就是HttpApplication的建構函式。 如下圖一,Abp定義了一個繼承自HttpApplication的類AbpApplication。該類的建構函式裡會建立AbpBootstrapper例項,然後再Application_Start方法中呼叫AbpBootstrapper的Initialize方法(稍後解釋)。 在Abp的實際web專案中Global.asax中定義的HttpApplication派生類必須繼承自AbpWebApplication
(圖 一)
(圖 二)
再看AbpBootstrapper的Initialize方法。AbpBootstrapper的Initialize()方法首先給IocManager的IocContainer(也就是IWindsorContainer, ABP使用Castle完成依賴注入) Install AbpCoreInstaller (如圖三). AbpCoreInstaller來註冊系統框架級的所有配置類,具體程式碼如下(如圖四)。
(圖 三)
除了DefaultModuleFinder其他都是單例的。AbpCoreInstaller註冊的是系統框架級(核心框架,也就是指Abp專案)的所有configuration. 很容易理解ABP先完成configuration的依賴注入,因為一個功能所依賴的configuration物件一般都是要在功能被使用前完成初始化。
(圖 四)
以下是AbpCoreInstaller程式碼在ABP原始碼中的位置。
(圖 五)
IocManager的IocContainer就是IWindsorContainer, ABP使用Castle完成依賴注入。
AbpBootstrapper類持有IocManager例項
AbpCoreInstaller只是完成註冊系統框架級的所有配置類。Abp支援自動完成符合Conventional(基於約定)的元件的註冊。 Conventional 的規則要通過繼承IConventionalDependencyRegistrar介面實現。
如下圖,ABP中繼承自IConventionalDependencyRegistrar介面的四個類。 其中
其他三個則分別註冊AbpDbContext,ApiController和Controller的派生類。
BasicConventionalRegistrar的程式碼,其註冊所有繼承至ITransientDependency,ISingletonDependency和IInterceptor介面的類。
IIocManager是處理依賴注入的核心介面,他將具體的註冊還有解析功能分別包含在其父介面IIocRegistrar和IIocResolver中。
相關推薦
ABP原始碼分析二:ABP中配置的註冊和初始化
一般來說,ASP.NET Web應用程式的第一個執行的方法是Global.asax下定義的Start方法。執行這個方法前HttpApplication 例項必須存在,也就是說其建構函式的執行必然是完成了。 ABP開始的地方就是HttpApplication的建構函式。 如下圖一,Abp定義了一個繼承自Http
Dubbo原始碼分析(二):Dubbo中採用的設計模式
1、工廠模式 ServiceConfig中有個欄位,程式碼是這樣的: 檢視文字列印 private static final Protocol protocol
ABP原始碼分析三:ABP Module
Abp是一種基於模組化設計的思想構建的。開發人員可以將自定義的功能以模組(module)的形式整合到ABP中。具體的功能都可以設計成一個單獨的Module。Abp底層框架提供便捷的方法整合每個Module.下圖是所有Abp自帶的module.AbpModule是所有Module的基類,其已經擁有了IIocMa
ABP原始碼分析五:ABP初始化全過程
ABP在初始化階段做了哪些操作,前面的四篇文章大致描述了一下。 為個更清楚的描述其脈絡,做了張流程圖以輔助說明。其中每一步都涉及很多細節,難以在一張圖中全部表現出來。每一步的細節(會涉及到較多介面,類,呼叫關係,步驟流程什麼的)會在後面的文章中通過其他圖和文字詳細描述。其實如果仔細分析Abp原始碼的話,會發現
ABP原始碼分析二十六:核心框架中的一些其他功能
本文是ABP核心專案原始碼分析的最後一篇,介紹一些前面遺漏的功能 AbpSession AbpSession: 目前這個和CLR的Session沒有什麼直接的聯絡。當然可以自定義的去實現IAbpSession使之與CLR的Session關聯 IAbpSession:定義如下圖中的四個屬性。 NullA
ABP原始碼分析二十:ApplicationService
IApplicationService : 空介面,起標識作用。所有實現了IApplicationService 的類都會被自動注入到容器中。同時所有IApplicationService物件都會被注入一些攔截器(例如:auditing, UnitOfWork等)以實現AOP AbpServiceBase:
ABP原始碼分析二十九:ABP.MongoDb
這個Module通過建立一個MongoDbRepositoryBase<TEntity> 基類,封裝了對MongoDb資料庫的操作。 這個module通過引用MongoDB.Driver,MongoDB.Bson,MongoDB.Driver.Core,MongoDB.Driver.Legacy類
ABP原始碼分析二十七:ABP.Entity Framework
IRepository:介面定義了Repository常見的方法 AbpRepositoryBase:實現了IRepository介面的常見方法 EfRepositoryBase:實現了AbpRepositoryBase中定義的抽象方法:GetAll,Insert,Delete,Update。在實
ABP原始碼分析二十五:EventBus
IEventData/EventData: 封裝了EventData資訊,觸發event的源物件和時間 IEventBus/EventBus: 定義和實現了了一系列註冊,登出和觸發事件處理函式的方法。EventBus定義了一個Dictionary容器來存放事件和處理該事件的物件(其實不是物件而是Factor
ABP原始碼分析二十二:Navigation
MenuDefinition:封裝了導航欄上的主選單的屬性。 MenuItemDefinition:封裝了主選單的子選單的屬性。子選單可以引用其他子選單構成一個選單樹 UserMenu/UserMenuItem:封裝了用於顯示給使用者的選單/以及子選單集合。 ABP通過MenuDefinition/M
ABP原始碼分析二十一:Feature
Feature是什麼?Feature就是對function的分類方法,其與function的關係就比如Role和User的關係一樣。 ABP中Feature具有以下屬性: 其中最重要的屬性是name,用以表示feature的Identity,一個feature一個name. 一個Feature可以有一組子F
ABP原始碼分析二十八:ABP.MemoryDB
這個模組簡單,且無實際作用。一般實際專案中都有用資料庫做持久化,用了資料庫就無法用這個MemoryDB 模組了。原因在於ABP限制了UnitOfWork的型別只能有一個(前文以作介紹),一般用了資料庫的必然要注入efUnitOfWork. 而注入了efUnitOfWork就不能在注入MemoryDbUnitO
ABP原始碼分析二十三:Authorization
Permission:用於定義一個Permission,一個permission可以包含多個子Permission. PermissionDictionary:繼承自Dictionary<string, Permission>類,很明顯是一個用於儲存permission物件的字典。 I
ABP原始碼分析二十四:Notification
NotificationDefinition: 用於封裝Notification Definnition 的資訊。注意和Notification 的區別,如果把Notification看成是具體的訊息內容,NotificationDefinition則是對這個訊息自身的定義(可理解為訊息的型別)。
ABP原始碼分析一:整體專案結構及目錄
ABP是一套非常優秀的web應用程式架構,適合用來搭建集中式架構的web應用程式。 整個Abp的Infrastructure是以Abp這個package為核心模組(core)+15個模組(module).其中13個依賴於Abp這個核心包。另外兩個包(FluentMigration,Web.Resources
ABP原始碼分析十三:快取Cache實現
ABP中有兩種cache的實現方式:MemroyCache 和 RedisCache. 如下圖,兩者都繼承至ICache介面(準確說是CacheBase抽象類)。ABP核心模組封裝了MemroyCache 來實現ABP中的預設快取功能。 Abp.RedisCache這個模組封裝RedisCache來實現快取(
ABP原始碼分析八:Logger整合
ABP使用Castle日誌記錄工具,並且可以使用不同的日誌類庫,比如:Log4Net, NLog, Serilog... 等等。對於所有的日誌類庫,Castle提供了一個通用的介面來實現,我們可以很方便的處理各種特殊的日誌庫,而且當業務需要的時候,很容易替換日誌元件。 Logger功能模組涉及到的介面和類不
ABP原始碼分析四:Configuration
核心模組的配置 Configuration是ABP中設計比較巧妙的地方。其通過AbpStartupConfiguration,Castle的依賴注入,Dictionary物件和擴充套件方法很巧妙的實現了配置中心化。配置中心化是一個支援模組開發的框架必備功能。 ABP中核心功能模組中的一些功能的執行時的
ABP原始碼分析六:依賴注入的實現
ABP的依賴注入的實現有一個本質兩個途徑:1.本質上是依賴於Castle這個老牌依賴注入的框架。2.一種實現途徑是通過實現IConventionalDependencyRegistrar的例項定義注入的約定(規則),然後通過IocManager來讀取這個規則完成依賴注入。3另一種實現途徑是直接IocManag
ABP原始碼分析七:Setting 以及 Mail
本文主要說明Setting的實現以及Mail這個功能模組如何使用Setting. 首先區分一下ABP中的Setting和Configuration。 Setting一般用於需要通過外部配置檔案(或資料庫)設定的簡單型別資料(一般就是字串),比如SMTP HOST. Configuration一般