ABP理论学习之启动配置

时间:2023-03-09 21:17:52
ABP理论学习之启动配置

返回总目录


本篇目录

为了在应用启动时配置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系统中,模块就可以创建集中配置点了,也就是说模块可以集中起来配置了。