【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系統中,模塊能夠建立集中配置的點。

相關文章
相關標籤/搜索