日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

【ABP框架系列学习】模块系统(4)

發布時間:2024/9/5 windows 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【ABP框架系列学习】模块系统(4) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【ABP框架系列學習】模塊系統(4) 原文:【ABP框架系列學習】模塊系統(4)

0.引言

ABP提供了構建模塊和通過組合模塊以創建應用程序的基礎設施。一個模塊可以依賴于另外一個模塊。通常,程序集可以認為是模塊。如果創建多個程序集的應用程序,建議為每個程序集創建模塊定義。

當前,模塊系統主要集中在服務器,而不是客戶端。

1.模塊定義

模塊是從ABP包中的AbpModule派生的類定義的。比如說開發一個可以用于不同應用程序的博客模塊(Blog Module)。最簡單的模塊定義如下 :

public class MyBlogApplicationModule : AbpModule {public override void Initialize(){IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());} }

模塊定義類負責通過依賴注入注冊類,如有必要(可以像上述事例按慣例完成)。它還可以配置應用程序和其它模塊,給應用程序增加新的功能等等。

2.生命周期方法

ABP在程序啟動和關閉時調用模塊一些特定的方法。你可以重寫這些方法以執行某些特定的任務。

ABP按照依賴順序調用這些方法。如果模塊A依賴模塊B,那么模塊B在模塊A之前初始化。

啟動方法執行準確的順序:PreInitialize-B, PreInitialize-A, Initialize-B, Initialize-A, PostInitialize-B,?PostInitialize-A。對于所有依賴關系圖都是如此。關閉方法也是類似的,但順序相反。

相關源碼:模塊啟動時依次執行PreInitialize()、Initialize()、PostInitialize(),模塊關閉時首先Reverse()、然后在逐個模塊Shutdown()。

public virtual void StartModules(){var sortedModules = _modules.GetSortedModuleListByDependency();sortedModules.ForEach(module => module.Instance.PreInitialize());sortedModules.ForEach(module => module.Instance.Initialize());sortedModules.ForEach(module => module.Instance.PostInitialize());}public virtual void ShutdownModules(){Logger.Debug("Shutting down has been started");var sortedModules = _modules.GetSortedModuleListByDependency();sortedModules.Reverse();sortedModules.ForEach(sm => sm.Instance.Shutdown());Logger.Debug("Shutting down completed.");}

PreInitialize

當應用程序啟動時,首先調用該方法。它是框架和其它模塊初始化之前配置它們的首選方法。

你還可以在該方法中編寫特定的代碼,以便在依賴注入注冊之前運行。例如,如果你創建一個傳統的注冊類,那么你應在該方法中使用IOCManager.AddConventionalRegisterer方法注冊它們。

Initialize

該方法是依賴注入注冊的地方,通過使用IocManager.RegisterAssemblyByConvention方法完成注冊。如果想定義自定義的依賴注冊,請見后續依賴注入章節。

PostInitialize

該方法在程序啟動的最后調用。在這里解析依賴是安全的。

Shutdown

該方法在程序關閉時調用。

3.模塊依賴(Module Dependencies)

一個模塊可以依賴于另外的模塊。你可以通過DependsOn特性顯示聲明依賴項,如下代碼:

[DependsOn(typeof(MyBlogCoreModule))] public class MyBlogApplicationModule : AbpModule {public override void Initialize(){IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());} }

上述事例代碼中,聲明了MyBlogApplicationModule模塊依賴于MyBlogCoreModule模塊,那么MyBlogCoreModule模塊應該在MyBlogApplicationModule模塊之前完成初始化。

ABP可以從啟動模塊(start module)開始就遞歸的解析依賴關系,并相應地初始化它們。啟動模塊(start module)是最后進行初始化的模塊。

4.插件模塊

雖然模塊從啟動模塊開始查找并遍歷依賴關系,ABP還可以動態加載模塊。AbpBootstrapper類中定義了PlugInSources屬性,該屬性可用于向動態加載的插件模塊添加源。插件源可以是實現IPlugInSource接口的任何類。通過實現FolderPlugInSource類以從指定文件夾中的程序集獲取插件模塊。

ASP.NET CORE

ABP中ASP.NET CORE模塊在AddAbp擴展方法中定義選項,用于在啟動類中添加插件源:

services.AddAbp<MyStartupModule>(options => {options.PlugInSources.Add(new FolderPlugInSource(@"C:\MyPlugIns")); });

也可以使用更簡單的語法AddFolder擴展方法:

services.AddAbp<MyStartupModule>(options => {options.PlugInSources.AddFolder(@"C:\MyPlugIns"); });

ASP.NET MVC,Web API

對于傳統的ASP.NET MVC應用程序,可以通過重寫global.asax文件中Application_Start方法添加插件文件夾,如下代碼:

public class MvcApplication : AbpWebApplication<MyStartupModule> {protected override void Application_Start(object sender, EventArgs e){AbpBootstrapper.PlugInSources.AddFolder(@"C:\MyPlugIns");//...base.Application_Start(sender, e);} }

Controllers in PlugIns

如果你的模塊包括MVC或Web API Controolers,ASP.NET不能查找你的控制器。為了克服這個問題,你可以修改global.asax文件,如下代碼:

using System.Web; using Abp.PlugIns; using Abp.Web; using MyDemoApp.Web;[assembly: PreApplicationStartMethod(typeof(PreStarter), "Start")]namespace MyDemoApp.Web {public class MvcApplication : AbpWebApplication<MyStartupModule>{}public static class PreStarter{public static void Start(){//...MvcApplication.AbpBootstrapper.PlugInSources.AddFolder(@"C:\MyPlugIns\");MvcApplication.AbpBootstrapper.PlugInSources.AddToBuildManager();}} }

附加程序集(Additional Assemblies)

默認實現IAssemblyFinder和ITypeFinder接口只能在這些程序集中查找模塊程序集和類型。也可以在模塊中重寫GetAdditionalAssembliesy方法來包括其它程序集。

自定義模塊方法(Custom Module Methods)

你的模塊還可以擁有自定義的方法,并能在依賴于這個模塊的其它模塊中調用這個方法。假設MyModule2依賴于MyModule1,并想在PreInitialize方法中調用MyModule1模塊中的方法。

public class MyModule1 : AbpModule {public override void Initialize(){IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());}public void MyModuleMethod1(){//this is a custom method of this module } }[DependsOn(typeof(MyModule1))] public class MyModule2 : AbpModule {private readonly MyModule1 _myModule1;public MyModule2(MyModule1 myModule1){_myModule1 = myModule1;}public override void PreInitialize(){_myModule1.MyModuleMethod1(); //Call MyModule1's method }public override void Initialize(){IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());} }

在上述代碼中,通過構造函數把MyModule1注入到MyModule2,所以MyModule2可以調用MyModule1中的自定義方法,前提是MyModule2依賴于MyModule1。

模塊配置(Module Configuration)

然而自定義方法可以用來配置模塊,建議使用啟動配置(startup configuration)系統來定義和設置模塊的配置。

模塊生命周期(Module Lifetime)

模塊類自動注冊為單實例對象(singleton)。

posted on 2018-11-26 08:29 NET未來之路 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/lonelyxmas/p/10018426.html

總結

以上是生活随笔為你收集整理的【ABP框架系列学习】模块系统(4)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。