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);
通過abpmodulemanager的initialize方法載入所有的模組
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...