ABP能夠在啓動的時候對模塊進行配置。c#
在模塊的PreInitialize方法中,能夠對ABP進行配置。配置示例以下:app
public class SimpleTaskSystemModule : AbpModule { public override void PreInitialize() { //Add languages for your application 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")); //Add a localization source Configuration.Localization.Sources.Add( new XmlLocalizationSource( "SimpleTaskSystem", HttpContext.Current.Server.MapPath("~/Localization/SimpleTaskSystem") ) ); //Configure navigation/menu Configuration.Navigation.Providers.Add<SimpleTaskSystemNavigationProvider>(); } public override void Initialize() { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); } }
ABP是模塊化設計,不一樣的模塊均可以對ABP進行配置。例如不一樣的模塊能夠經過添加不一樣的導航提供者來在主菜單上添加本身的菜單項。框架
Configuration.ReplaceService 方法能夠用來重寫ABP中的內置服務。例如,你能夠本身實現一個管理會話的服務(MySession), 而後使用Configuration.ReplaceService來替換掉ABP中內置的會話服務。ide
Configuration.ReplaceService<IAbpSession, MySession>(DependencyLifeStyle.Transient);
ReplaceService有一個重載方法,能夠經過傳遞action參數來實現自定義替換。例如使用自定義的DbPerTenantConnectionStringResolver來替換IConnectionStringResolver, 代碼以下:模塊化
Configuration.ReplaceService(typeof(IConnectionStringResolver), () => { IocManager.Register<IConnectionStringResolver, DbPerTenantConnectionStringResolver>(DependencyLifeStyle.Transient); });
一個服務能夠被替換屢次,這種狀況在不一樣的模塊中比較容易出現(例如服務A在模塊A中被替換了一次,在模塊B中又被替換了一次)。那麼最後一次被替換的服務纔是會被正確使用的服務,哪個服務是最後一次被替換的服務,則是經過模塊依賴的加載順序來可肯定。this
除了ABP框架自身提供的啓動配置外,模塊也能夠經過擴展IAbpModuleConfigurations 接口提供本身的配置。設計
public static class AbpWebConfigurationExtensions { public static IAbpWebCommonModuleConfiguration AbpWebCommon(this IModuleConfigurations configurations); }
... using Abp.Web.Configuration; ... public override void PreInitialize() { Configuration.Modules.AbpWebCommon().SendAllExceptionsToClients = true; } ...
在上面的示例中,咱們先經過AbpWebCommon擴展方法對IModuleConfigurations接口進行了擴展,接着在模塊的PreInitialize方法中配置AbpWebCommon模塊,將全部的異常信息都發送給客戶端。code
假設咱們定義了一個MyModule的模塊,這個模塊有一些配置屬性,那麼第一步,咱們能夠爲這些配置屬性建立一個類接口
public class MyModuleConfig { public bool SampleConfig1 { get; set; } public string SampleConfig2 { get; set; } }
接着咱們能夠在模塊的PreInitialize 方法中,經過依賴除注入註冊這個配置類,這樣它就能夠被注入了。get
IocManager.Register<MyModuleConfig>();
如上代碼所示,配置類應該被註冊爲單實例的。註冊後,咱們就能夠對MyModule模塊進行配置了:
Configuration.Get<MyModuleConfig>().SampleConfig1 = false;
上述代碼中,直接使用了Configuration.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內置的模塊配置也是經過這種擴展方法的方式來實現的。
設置了配置信息後,若是模塊中的其餘服務須要獲取模塊配置信息(MyModuleConfig),咱們能夠注入MyModuleConfig,接着就可使用了。
public class MyService : ITransientDependency { private readonly MyModuleConfig _configuration; public MyService(MyModuleConfig configuration) { _configuration = configuration; } public void DoIt() { if (_configuration.SampleConfig2 == "test") { //... } } }
經過這種方方式,ABP就能夠對模塊就行集中的配置管理了。在統一的地方進行模塊的配置設置,在須要使用的地方經過注入的方式來獲取配置的值。