ABP模塊運行解析


從官方創建一份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一樣的,實現方法不一樣而已。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM