1. 程式人生 > >【ABP框架系列學習】啟動配置(5)

【ABP框架系列學習】啟動配置(5)

ABP提供了在啟動時配置模組的基礎設施和模型。

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)往主選單新增自定義子選單。

替換內建(Built-In)服務

Configuration.ReplaceService()方法可以覆蓋內建服務。例如,你可以用定義實現的類替換IAbpSession服務:

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

ReplaceService()方法通過過載操作以定義方式實現替換(也可以直接使用Castle Windsor高階的註冊API)。

同一個服務可以多次被替換,尤其是在不同的模組間。生效的服務是最後被替換的那個。PreInitialize()方法按依賴順序執行。

2.配置模組

除了ABP框架自身的啟動配置外,模組也可以通過擴充套件IAbpModuleConfigurations介面,為模組提供配置點。

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

在上述程式碼中,配置AbpWebCommon模組把所有異常傳送給客戶端。

不是每個模組都應該定義類似這種型別的配置,通常情況是在不同的應用程式中需要重複使用的才定義,並且要在啟動時進行配置。

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系統中,模組可以建立集中配置的點。