ABP 框架從源碼學習1--AbpBootstrapper

来源:http://www.cnblogs.com/xuzimian/archive/2016/06/05/5561708.html
-Advertisement-
Play Games

一開始可能會寫得很亂,因為自己也不太清楚從哪裡入手,可能會直接將一些別人的心得羅列出來,後面我會在吸收了以後,找到了頭緒,然後整理歸納出自己的東西。 不多扯了,先摘一段別人的心得,原文鏈接http://www.cnblogs.com/Azula/p/4988949.html 一 . AbpBoots ...


一開始可能會寫得很亂,因為自己也不太清楚從哪裡入手,可能會直接將一些別人的心得羅列出來,後面我會在吸收了以後,找到了頭緒,然後整理歸納出自己的東西。

不多扯了,先摘一段別人的心得,原文鏈接http://www.cnblogs.com/Azula/p/4988949.html

 

一 . AbpBootstrapper類在Abp.dll中,其主要用於框架的基本配置的註冊和初始化,在Web應用啟動階段實例化一個AbpBootstrapper並調用Initialize方法初始化,

 

    public abstract class AbpWebApplication : HttpApplication
    {
        /// <summary>
        /// Gets a reference to the <see cref="AbpBootstrapper"/> instance.
        /// </summary>
        protected AbpBootstrapper AbpBootstrapper { get; private set; }

        protected AbpWebApplication()
        {
            AbpBootstrapper = new AbpBootstrapper();
        }

        /// <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();

            AbpBootstrapper.IocManager.RegisterIfNot<IAssemblyFinder, WebAssemblyFinder>();
            AbpBootstrapper.Initialize();
        }

而在 AbpBootstrapper.Initialize()方法中在執行AbpBootstrapper的Initialize()方法時首先會執行

 

    public virtual void Initialize()
        {
            IocManager.IocContainer.Install(new AbpCoreInstaller());

            IocManager.Resolve<AbpStartupConfiguration>().Initialize();

            _moduleManager = IocManager.Resolve<IAbpModuleManager>();
            _moduleManager.InitializeModules();
        }

 

 

 

AbpBootstrapper的Initialize() 主要執行的就是註冊系統框架級的所有配置類,具體代碼如下

 internal class AbpCoreInstaller : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(
                Component.For<IUnitOfWorkDefaultOptions, UnitOfWorkDefaultOptions>().ImplementedBy<UnitOfWorkDefaultOptions>().LifestyleSingleton(),
                Component.For<INavigationConfiguration, NavigationConfiguration>().ImplementedBy<NavigationConfiguration>().LifestyleSingleton(),
                Component.For<ILocalizationConfiguration, LocalizationConfiguration>().ImplementedBy<LocalizationConfiguration>().LifestyleSingleton(),
                Component.For<IAuthorizationConfiguration, AuthorizationConfiguration>().ImplementedBy<AuthorizationConfiguration>().LifestyleSingleton(),
//此處省略若幹行
); } }

  接著解析AbpStartupConfiguration的實例調用其Initialize()來完成所有配置項的初始設值。

  解析IAbpModuleManager的實例調用其InitializeModules()初始化所有的Module

 

一旦應用程式結束將在AbpWebApplications中調用

 protected virtual void Application_End(object sender, EventArgs e)
        {
            AbpBootstrapper.Dispose();
        }

AbpBootstrapper的Dispose方法中析構IAbpModuleManager,執行其ShutdownModules,關閉所有Module。

 

 二.下麵看一下AbpBootstrapper中的兩個至關重要的屬性:IIocManager 和 IAbpModuleManager 

  public class AbpBootstrapper : IDisposable
    {
        /// <summary>
        /// Gets IIocManager object used by this class.
        /// </summary>
        public IIocManager IocManager { get; private set; }

        /// <summary>
        /// Is this object disposed before?
        /// </summary>
        protected bool IsDisposed;

        private IAbpModuleManager _moduleManager;
//.........
}

 

IIocManager內部包裝了一個Castle的依賴註入容器IWindsorContainer(abp使用的是Castle windor框架,在此框架的基礎上做了一些封裝),

所有類型的註冊,解析還有後面實現的AOP機制的攔截器都是註冊在該容器中的,將具體的註冊還有解析功能分別包含在其父介面IIocRegistrar和IIocResolver中,

 public interface IIocManager : IIocRegistrar, IIocResolver, IDisposable
    {
        /// <summary>
        /// Reference to the Castle Windsor Container.
        /// </summary>
        IWindsorContainer IocContainer { get; }

        /// <summary>
        /// Checks whether given type is registered before.
        /// </summary>
        /// <param name="type">Type to check</param>
        new bool IsRegistered(Type type);

        /// <summary>
        /// Checks whether given type is registered before.
        /// </summary>
        /// <typeparam name="T">Type to check</typeparam>
        new bool IsRegistered<T>();
    }

其中IIocRegistrar類的

1.AddConventionalRegistrar,

2.RegisterAssemblyByConvention(Assembly assembly),

3.RegisterAssemblyByConvention(Assembly assembly, ConventionalRegistrationConfig config) 三個方法需要特別註意:

 

第一個方法,AddConventionalRegistrar是向IocManager的一個私有泛型集合List<IConventionalDependencyRegistrar>註冊註冊機制,這句話不太好明白,簡單說就是設定依賴註入模塊的註入方式,

通常所有的Module類的預初始化方法中調用以決定哪些類型需要被註冊(如果沒有就無需調用),

比如在Abp程式集中的BasicConventionalRegistrar實現的就是搜索並註冊指定的程式集中的所有實現了ITransientDependency,ISingletonDependency和IInterceptor的類並註冊到依賴容器中,

 

第二,第三個方法執行真正的註冊邏輯,

通常在一個個具體的Module的初始化方法中調用,傳入當前Module所屬的程式集,

迭代List<IConventionalDependencyRegistrar>將當前程式集作為參數執行註冊,

第二,第三個方法的區別在於第三個方法多了一個ConventionalRegistrationConfig參數,以決定是否還需要搜索當前程式及中的IWindsorInstaller的實現類進行註冊,預設是需要的。

 

IAbpModuleManager主要用於管理所有的模塊預設也就是一個個的程式集(一個模塊對應一個程式集),主要用於搜索到所有的Module以及他們的依賴Module,首先執行所有Module的PreInitialize方法再執行所有的Initialize,最後執行所有的PostInitialize,執行IAbpModuleManager的ShutdownModules時順序顛倒依次執行所有具體Module的ShutDown方法。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天把一個列表轉換成字元串輸出的時候出現了UnicodeEncodeError: 'ascii' codec can't encode characters in position 32-34: ordinal not in range(128)問題,使用的是ulipad編譯器。 解決方法1: 在開 ...
  • 設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。毫無疑問,設計模式於己於他人於系統都是多贏的,設計模式使代碼編製真正工程化,設計模式是軟體工程的基石,如同大廈的一塊塊磚石 ...
  • 1 打開文件 在對文件進行讀、寫操作之前,首先要解決的問題是如何把程式中要讀、寫的文件與磁碟上實際的數據文件聯繫起來。在 C 語言中這並不困難,只需調用 C 語言提供的庫函數 fopen “打開”文件就可實現這些聯繫。fopen 函數的一般調用形式為: fopen(文件名,文件使用方式); 函數返回 ...
  • 轉自:http://www.gowhich.com/blog/147?utm_source=tuicool&utm_medium=referral 源碼下載的地址:https://github.com/fxsjy/jieba 演示地址:http://jiebademo.ap01.aws.af.cm/ ...
  • web許可權設計,做許可權目前有三種主流實現方式 第一種:手動實現 配置2個攔截器,一個是攔截是否登陸,一個是攔截url的許可權,通過角色許可權表的配置,把許可權url的路徑與訪問資源的url進行匹配 第二種:spring-security實現,比較重,不推薦 第三章:shiro,目前spring已經捨棄自己 ...
  • 緩存是分散式系統中的重要組件,主要解決高併發,大數據場景下,熱點數據訪問的性能問題。提供高性能的數據快速訪問。 本文是緩存在分散式應用第二篇文章,介紹分散式緩存,Memcache,Redis,本地緩存(硬碟緩存,記憶體緩存)以及緩存在分散式系統中的架構示例。 ...
  • 緩存是分散式系統中的重要組件,主要解決高併發,大數據場景下,熱點數據訪問的性能問題。提供高性能的數據快速訪問。 本文是緩存在分散式應用第一篇文章,介紹緩存的原理,緩存的分類,緩存的設計,CDN緩存(原理,架構參考和技術實踐),反向代理緩存(原理,Squid架構實踐和常用代理緩存之間的比較)。 ...
  • Atitit.用戶許可權服務 登錄退出功能 參數說明 /com.attilax/user/loginOut.jsp?url="+url Utype=mer 作者:: ★(attilax)>>> 綽號:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿爾 拉 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...