【ABP框架系列學習】啟動配置(5)
ABP提供了在啟動時配置模組的基礎設施和模型。
1.配置ABP
配置ABP是在模組的PreInitialize方法中完成的,例如:
public class SimpleTaskSystemModule : AbpModule { public override void PreInitialize() { //新增語言 Configuration.Localization.Languages.Add(new LanguageInfo("en", "English", "famfamfam-flag-england", true)); Configuration.Localization.Languages.Add(new LanguageInfo("tr", "Türkçe", "famfamfam-flag-tr")); //新增本地化語言 Configuration.Localization.Sources.Add( new XmlLocalizationSource( "SimpleTaskSystem", HttpContext.Current.Server.MapPath("~/Localization/SimpleTaskSystem") ) );//配置導航選單 Configuration.Navigation.Providers.Add<SimpleTaskSystemNavigationProvider>(); } public override void Initialize() { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); } }
ABP是基於模組設計的。不同的模組都可以配置ABP。例如:不同的模組可以新增導航提供者(navigation providers)往主選單新增自定義子選單。
替換內建(Built-In)服務
Configuration.ReplaceService()方法可以覆蓋內建服務。例如,你可以用定義實現的類替換IAbpSession服務:
Configuration.ReplaceService<IAbpSession, MySession>(DependencyLifeStyle.Transient);
ReplaceService()方法通過過載操作以定義方式實現替換(也可以直接使用Castle Windsor高階的註冊API)。
同一個服務可以多次被替換,尤其是在不同的模組間。生效的服務是最後被替換的那個。PreInitialize()方法按依賴順序執行。
2.配置模組
除了ABP框架自身的啟動配置外,模組也可以通過擴充套件IAbpModuleConfigurations介面,為模組提供配置點。
... using Abp.Web.Configuration; ... public override void PreInitialize() { Configuration.Modules.AbpWebCommon().SendAllExceptionsToClients = true; } ...
在上述程式碼中,配置AbpWebCommon模組把所有異常傳送給客戶端。
不是每個模組都應該定義類似這種型別的配置,通常情況是在不同的應用程式中需要重複使用的才定義,並且要在啟動時進行配置。
3.為模組建立配置
假設我們有一個叫MyModule的模組,它帶有一些配置屬性。首先,為這些配置屬性建立一個類:
public class MyModuleConfig { public bool SampleConfig1 { get; set; } public string SampleConfig2 { get; set; } }
然後在PreInitialize方法中通過DI(Dependency Injection)註冊這個類(因此,MyModuleConfig是可註冊的類):
IocManager.Register<MyModuleConfig>();
像本事例那樣註冊為單例物件。那麼,我們可以使用如下程式碼在PreInitialize方法中配置MyModule模組:
Configuration.Get<MyModuleConfig>().SampleConfig1 = false;
然而我們可以類似如下程式碼,通過建立IModuleConfigurations擴充套件方法,使用IAbpStartupConfiguration.Get()方法獲得引用:
public static class MyModuleConfigurationExtensions { public static MyModuleConfig MyModule(this IModuleConfigurations moduleConfigurations) { return moduleConfigurations.AbpConfiguration.Get<MyModuleConfig>(); } }
那麼,其它模組可以通過擴充套件方法配置MyModule模組:
Configuration.Modules.MyModule().SampleConfig1 = false; Configuration.Modules.MyModule().SampleConfig2 = "test";
這使得查詢模組配置和收集它們變得容易(Configuration.Modules...)。ABP本身為它自己的模組配置定義了擴充套件方法。
在某些地方,MyModule模組需要這些配置,你可以通過建構函式注入並使用配置值。如下:
public class MyService : ITransientDependency { private readonly MyModuleConfig _configuration; public MyService(MyModuleConfig configuration) { _configuration = configuration; } public void DoIt() { if (_configuration.SampleConfig2 == "test") { //... } } }
這樣,在ABP系統中,模組可以建立集中配置的點。