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就能够对模块就行集中的配置管理了。在统一的地方进行模块的配置设置,在须要使用的地方经过注入的方式来获取配置的值。