1. 程式人生 > >ABP框架 - 啟動配置

ABP框架 - 啟動配置

gas exe 擴展 context new nav 啟動 web tenant

ABP可以在啟動的時候對模塊進行配置。

配置ABP

在模塊的PreInitialize方法中,可以對ABP進行配置。配置示例如下:

public class SimpleTaskSystemModule : AbpModule
{
    public override void PreInitialize()
    {
        //Add languages for your application
        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"));

        //Add a localization source
        Configuration.Localization.Sources.Add(
            new XmlLocalizationSource(
                "SimpleTaskSystem",
                HttpContext.Current.Server.MapPath("~/Localization/SimpleTaskSystem")
                )
            );

        //Configure navigation/menu
        Configuration.Navigation.Providers.Add<SimpleTaskSystemNavigationProvider>();        
    }

    public override void Initialize()
    {
        IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
    }
}

ABP是模塊化設計,不同的模塊都可以對ABP進行配置。例如不同的模塊可以通過添加不同的導航提供者來在主菜單上添加自己的菜單項。

替換內置服務

Configuration.ReplaceService 方法可以用來重寫ABP中的內置服務。例如,你可以自己實現一個管理會話的服務(MySession), 然後使用Configuration.ReplaceService來替換掉ABP中內置的會話服務。

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

ReplaceService有一個重載方法,可以通過傳遞action參數來實現自定義替換。例如使用自定義的DbPerTenantConnectionStringResolver來替換IConnectionStringResolver, 代碼如下:

Configuration.ReplaceService(typeof(IConnectionStringResolver), () =>
{
    IocManager.Register<IConnectionStringResolver, DbPerTenantConnectionStringResolver>(DependencyLifeStyle.Transient);
});

一個服務可以被替換多次,這種情況在不同的模塊中比較容易出現(例如服務A在模塊A中被替換了一次,在模塊B中又被替換了一次)。那麽最後一次被替換的服務才是會被正確使用的服務,哪一個服務是最後一次被替換的服務,則是通過模塊依賴的加載順序來可確定。

配置模塊

除了ABP框架自身提供的啟動配置外,模塊也可以通過擴展IAbpModuleConfigurations 接口提供自己的配置。

public static class AbpWebConfigurationExtensions
{
    public static IAbpWebCommonModuleConfiguration AbpWebCommon(this IModuleConfigurations configurations);
}
...
using Abp.Web.Configuration;
...
public override void PreInitialize() 
{
    Configuration.Modules.AbpWebCommon().SendAllExceptionsToClients = true;
}
...

在上面的示例中,我們先通過AbpWebCommon擴展方法對IModuleConfigurations接口進行了擴展,接著在模塊的PreInitialize方法中配置AbpWebCommon模塊,將所有的異常信息都發送給客戶端。

為模塊創建配置

假設我們定義了一個MyModule的模塊,這個模塊有一些配置屬性,那麽第一步,我們可以為這些配置屬性創建一個類

public class MyModuleConfig
{
    public bool SampleConfig1 { get; set; }

    public string SampleConfig2 { get; set; }
}

接著我們可以在模塊的PreInitialize 方法中,通過依賴除註入註冊這個配置類,這樣它就可以被註入了。

IocManager.Register<MyModuleConfig>();

如上代碼所示,配置類應該被註冊為單實例的。註冊後,我們就可以對MyModule模塊進行配置了:

Configuration.Get<MyModuleConfig>().SampleConfig1 = false;

上述代碼中,直接使用了Configuration.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內置的模塊配置也是通過這種擴展方法的方式來實現的。

設置了配置信息後,如果模塊中的其他服務需要獲取模塊配置信息(MyModuleConfig),我們可以註入MyModuleConfig,接著就可以使用了。

public class MyService : ITransientDependency
{
    private readonly MyModuleConfig _configuration;

    public MyService(MyModuleConfig configuration)
    {
        _configuration = configuration;
    }

    public void DoIt()
    {
        if (_configuration.SampleConfig2 == "test")
        {
            //...
        }
    }
}

通過這種方方式,ABP就可以對模塊就行集中的配置管理了。在統一的地方進行模塊的配置設置,在需要使用的地方通過註入的方式來獲取配置的值。

ABP框架 - 啟動配置