【ABP框架系列学习】启动配置(5)

ABP提供了在启动时配置模块的基础设施和模型。app

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)往主菜单添加自定义子菜单。ide

替换内置(Built-In)服务

Configuration.ReplaceService()方法能够覆盖内置服务。例如,你能够用定义实现的类替换IAbpSession服务:函数

Configuration.ReplaceService<IAbpSession, MySession>(DependencyLifeStyle.Transient);

ReplaceService()方法经过重载操做以定义方式实现替换(也能够直接使用Castle Windsor高级的注册API)。ui

同一个服务能够屡次被替换,尤为是在不一样的模块间。生效的服务是最后被替换的那个。PreInitialize()方法按依赖顺序执行。this

2.配置模块

除了ABP框架自身的启动配置外,模块也能够经过扩展IAbpModuleConfigurations接口,为模块提供配置点。spa

...
using Abp.Web.Configuration;
...
public override void PreInitialize()
{
    Configuration.Modules.AbpWebCommon().SendAllExceptionsToClients = true;
}
...

在上述代码中,配置AbpWebCommon模块把全部异常发送给客户端。设计

不是每一个模块都应该定义相似这种类型的配置,一般状况是在不一样的应用程序中须要重复使用的才定义,而且要在启动时进行配置。code

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系统中,模块能够建立集中配置的点。

相关文章
相关标签/搜索