ABP啟動流程分析

2022-02-09 15:22:50 字數 4138 閱讀 4150

public iserviceprovider configureservices(iservicecollection services)

先來看看startup這個類的configureservices方法,注意這個方法的返回值,我們知道使用vs建立的專案 返回值為void,但是使用abp的話 返回值是iserviceprovider,這是因為這裡有個addabp()方法,這就是我們的入口點,主要做的就是將abp整合到asp.net core其返回值就是iserviceprovider,因為abp有自己的第三方ioc框架(castlewindsor),所以它接管了.net core自帶的容器,至於為什麼,其實在webhost的initialize(初始化)方法中做的第一件事就是找到startup類,執行configureservices()方法 }

private void ensurestartup()

_startup = _hostingserviceprovider.getservice();

if (_startup == null)

or specifying the startup assembly via in the web host configuration.");

}}where tstartupmodule : abpmodule

where tstartupmodule : abpmodule

private static void configureaspnetcore(iservicecollection services, iiocresolver iocresolver)

; });

//configure mvc

services.configure(mvcoptions =>

);//configure razor

services.insert(0,

servicedescriptor.singleton>(

new configureoptions(

(options) =>))

);}

內部主要是做了與asp.net core相關的配置,其中mvcoptions.addabp(services);內部執行addfilters方法新增abp自己的過濾器

private static void addfilters(mvcoptions options)

裡面註冊了一堆ioc相關的服務並建立實現了iserviceprovider的例項型別,接管asp.net core預設的servercollection.

我們再來看看configure中的useabp方法,來到其內部

if (options.useabprequestlocalization)

if (options.usesecurityheaders)

}

public virtual void initialize()

catch (exception ex)

}

可以看到上述**中iocmanager.ioccontainer.install(new abpcoreinstaller());這裡其實就是在註冊一些基礎設施

internal class abpcoreinstaller : iwindsorinstaller

}

可以看到有工作單元,快取,審計日誌....等一系列的基礎設施,都是在這裡被註冊的.

載入模組

_modulemanager = iocmanager.resolve();

_modulemanager.initialize(startupmodule);

通過abpmodulemanagerinitialize方法載入所有的模組

public virtual void initialize(type startupmodule)

可以看到,直接初始化了abpmodulecollection集合,它本質就是個集合,只不過有些「自定義」的排序方法

private void loadallmodules()

modules loaded.", _modules.count);

}

首先在findallmoduletypes方法內部通過啟動模組上面的[dependson]標籤來從最外層載入外掛程式形式的模組與內部模組

之後將通過registermodules所有模組單例注入到 ioc 容器內部

public static bool registerifnot(this iiocregistrar iocregistrar, type type, dependencylifestyle lifestyle=dependencylifestyle.singleton)

iocregistrar.register(type, lifestyle);

return true;

}

createmodules方法則是從ioc容器中獲取乙個模組,為模組配置一些屬性如:iocmanager以及configuration 幷包裝成abpmoduleinfo物件

private void createmodules(icollectionmoduletypes, listpluginmoduletypes)

moduleobject.iocmanager = _iocmanager;

moduleobject.configuration = _iocmanager.resolve();

var moduleinfo = new abpmoduleinfo(moduletype, moduleobject, pluginmoduletypes.contains(moduletype));

_modules.add(moduleinfo);

if (moduletype == _modules.startupmoduletype)

logger.debugformat("loaded module: " + moduletype.assemblyqualifiedname);

}}

初始化模組

ps:**上面貼過

public virtual void startmodules()

/// /// sorts modules according to dependencies.

/// if module a depends on module b, a comes after b in the returned list.

///

/// sorted list

public listgetsortedmodulelistbydependency()

可以看到startmodules中首先執行了getsortedmodulelistbydependency方法 該方法是對模組進行最後一次排序,確保載入順序正確.排序後,則是依次呼叫模組生命週期方法。

public virtual void shutdownmodules()

/// /// disposes the abp system.

///

public virtual void dispose()

isdisposed = true;

_modulemanager?.shutdownmodules();

}

ubuntu upstart啟動流程分析

簡介 最近做linux課程設計 核心裁剪和檔案系統定製 選擇了ubuntu10.10作為實驗的平台。不同的linux發行版,使用者態的初始化機制有所差別,ubuntu自從6.10版本之後就使用了較新的upstart機制來進行系統的初始化。upstart是一種基於事件驅動的服務啟動機制,可以使多個系統...

Ubuntu init啟動流程分析

之前在查詢linux系統init流程的相關資料時總是能夠看到inittab的身影,但是在我的ubuntu上是沒有這個檔案的,到後來才知道採用 upstart方式的ubuntu上是沒有inittab這個檔案的。在舊式的system v initialization中,etc inittab可是個相當重...

Redis 啟動流程分析

redis是基於c語言的,每個c檔案對應乙個模組,可以認為是乙個元件。根據對其源 的分析可以得出,在redis服務啟動的時候涉及到以下幾個元件模組和方法。在redis.c的main函式,主要做三件事情 1 載入配置包括從命令列或者傳入配置檔案載入 2 啟動unix和tcp的監聽,客戶端的列表儲存在r...