從官方創建一份ASP.NET CORE 2.0的項目,並加入源碼調試,可以看出如下圖的加載順序

1.ABP是通過什么樣的機制加載的
既然ABP中模塊需要添加DLL到引用中,又要加入DependsOn在類前面,前者已經在程序集中加入了,后天是做的什么工作?
現有Module A依賴Module B

假設Module B 和Module A都是靜態類,可能就不需要進行物理關聯了,DependsOn也是沒有什么用的。
通過分析源碼可以看出,整個ABP實際就是對依賴注冊和控制反轉的管理。ABP Modules也不例外。
2.ABP的模塊如何調用依賴模塊中的其他類,例如

例如ModuleB有IUserService和IRoleService,那么我們如何調用他呢。
在IOC架構的系統中,萬年不變的順序就是
(1)找到相關類,並通過Ioc注冊
(2)使用的時候通過控制反轉,依賴注入即可
在ABP中,模塊的加載,只負責各個模塊的加載、釋放。不負責具體模塊內的類注冊。
在ABP中,各個模塊中需要注冊使用的類通過PreInitialize方法進行自行管理。
例如 Abp.AutoMapper中的AbpAutoMapperModule
public override void PreInitialize() { IocManager.Register<IAbpAutoMapperConfiguration, AbpAutoMapperConfiguration>(); Configuration.ReplaceService<ObjectMapping.IObjectMapper, AutoMapperObjectMapper>(); Configuration.Modules.AbpAutoMapper().Configurators.Add(CreateCoreMappings); }
3.系統核心的類是通過什么方式注入的
ABP系統核心的類注冊都放到了Abp.Dependency.Installers 下的AbpCoreInstaller.cs文件中
通過AbpBootstrapper.Initialize 來注冊 IocManager.IocContainer.Install(new AbpCoreInstaller());
/// <summary> /// Initializes the ABP system. /// 初始化ABP系統 /// </summary> public virtual void Initialize() { //獲取日志 ResolveLogger(); try { //獲取啟動類 RegisterBootstrapper(); //注冊基礎的類 IocManager.IocContainer.Install(new AbpCoreInstaller()); //獲取插件 添加PlugInSources IocManager.Resolve<AbpPlugInManager>().PlugInSources.AddRange(PlugInSources); //獲取AbpStartupConfiguration 並初始化 IocManager.Resolve<AbpStartupConfiguration>().Initialize(); //使用Abp模塊管理器 _moduleManager = IocManager.Resolve<AbpModuleManager>(); //初始化模塊 _moduleManager.Initialize(StartupModule); //啟動模塊 _moduleManager.StartModules(); } catch (Exception ex) { _logger.Fatal(ex.ToString(), ex); throw; } }
4.ABP是否支持插件式方式加載
官方目前所有的實例,都是通過引用加載DLL來實現依賴。實際上ABP是支持Plugins方式指定目錄存放DLL文件的。
這也不難理解,既然ABP的Module工作方式,是獨立的,那么DLL程序集存放在哪里都是一樣的。
在官方給出的文檔 已有說明 https://aspnetboilerplate.com/Pages/Documents/Module-System
我們可以通過AddAbp服務實現
services.AddAbp<MyStartupModule>(options => { options.PlugInSources.Add(new FolderPlugInSource(@"C:\MyPlugIns")); });
5.了解了ABP的模塊工作方式,我們就可以依葫蘆畫瓢,實現相同的工作原理。
實際上我再關注另一個框架 http://www.zkweb.org/ 其模塊依賴的原理是跟ABP一樣的,實現方法不一樣而已。
