本篇目錄
為了在應用啟動時配置ABP和模塊,ABP提供了一個基礎設施。
配置ABP###
配置ABP是在模塊的PreInitialize事件中完成的。下面的代碼摘自Github上的Taskever(一個任務系統Demo):
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。比如,不同的模塊可以通過添加導航提供者來給主菜單添加自己的菜單選項。
配置模塊###
除了ABP框架自身的啟動配置之外,模塊也可以實現IAbpModuleConfigurations接口來為模塊提供配置點。比如:
...
using Abp.Web.Configuration;
...
public override void PreInitialize()
{
Configuration.Modules.AbpWeb().SendAllExceptionsToClients = true;
}
...
在本例中,我們配置了AbpWeb模塊,目的是將所有的異常發送到客戶端。
並不是每一個模塊都應該定義這種類型的配置。一般是當一個模塊需要在不同的應用中重用的時候,才需要在啟動時進行配置。
為模塊創建配置###
假設我們有一個叫做“MyModule”的模塊,它有一些配置屬性。首先,我們為這些配置屬性創建一個類MyModuleConfig:
public class MyModuleConfig
{
public bool SampleConfig1 { get; set; }
public string SampleConfig2 { get; set; }
}
然后,我們在MyModule的PreInitialize事件中將這個類MyModuleConfig注冊到DI中(這樣,MyModuleConfig就成為了可注冊的類):
IocManager.Register<MyModuleConfig>();
最后,我們創建IModuleConfiguration的擴展方法來獲得MyModuleConfig的引用。
public static class MyModuleConfigurationExtensions
{
public static MyModuleConfig MyModule(this IModuleConfigurations moduleConfigurations)
{
return moduleConfigurations.AbpConfiguration
.GetOrCreate("MyModuleConfig",
() => moduleConfigurations.AbpConfiguration.IocManager.Resolve<MyModuleConfig>()
);
}
}
現在,在應用啟動時,其他的模塊就可以配置這個模塊了(在需要配置MyModule的模塊的PreInitialize事件中):
Configuration.Modules.MyModule().SampleConfig1 = false;
Configuration.Modules.MyModule().SampleConfig2 = "test";
有時候,MyModule需要這樣的配置。你可以注冊MyModuleConfig,並使用配置的值。例如:
public class MyService : ITransientDependency
{
private readonly MyModuleConfig _configuration;
public MyService(MyModuleConfig configuration)
{
_configuration = configuration;
}
public void DoIt()
{
if (_configuration.SampleConfig2 == "test")
{
//...
}
}
}
這樣,在ABP系統中,模塊就可以創建集中配置點了,也就是說模塊可以集中起來配置了。