點這裡進入ABP系列文章總目錄
基于DDD的現代ASP.NET開發架構--ABP系列之5、ABP啟動配置
ABP是“ASP.NET Boilerplate Project (ASP.NET樣闆項目)”的簡稱。
ABP的官方網站:http://www.aspnetboilerplate.com
ABP在Github上的開源項目:https://github.com/aspnetboilerplate
本文由 東莞-天道 提供翻譯
譯者注:在看這一節的内容之前,建議大家先下載下傳module-zero這個例子代碼,這個例子就是一個使用者和角色的子產品,并且使用的執行個體。配置在每一個應用中都可能會有,比如你有一個網站,你要擷取網站的一些自定義基本參數,比如logo位置,網站名稱,上傳檔案大小等等。子產品化的配置方式和我們之前的做法肯定是不同的,大家要注意。之前無非就是一個方法getconfig從對應的表取資料,然後使用。
在應用啟動之前,abp架構提供了子產品基本的配置和方法,大家參照下面這個例子就可以了。
配置ABP
配置是通過在自己子產品的PreInitialize方法中來實作的(對于module的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());
}
}
和orchard類似,abp架構一開始就被設計成子產品化的,不同的子產品可以通過abp架構來進行配置。舉個例子吧,不同的子產品都可以添加導航,通過導航添加菜單項到自己定義的主菜單,具體的細節大家可以參照:
- 本地化:http://www.aspnetboilerplate.com/Pages/Documents/Localization
- 導航:http://www.aspnetboilerplate.com/Pages/Documents/Navigation
配置子產品
和.net架構原生的啟動配置相比較,abp有哪些不一樣呢?abp架構的子產品可以通過IAbpModuleConfigurations接口進行個性化的擴充,這樣的話,子產品配置更加簡單、友善。
示例代碼如下:
...
using Abp.Web.Configuration;
...
public override void PreInitialize()
{
Configuration.Modules.AbpWeb().SendAllExceptionsToClients = true;
}
...
在上面這個例子中,我們通過配置AbpWeb子產品,發送異常到用戶端。當然了,不是每一個子產品都需要這種配置,通常情況下我們需要,是當一個子產品需要在多個不同的應用中重複使用,我們才進行這樣的配置。
為一個子產品建立配置
如下代碼,假如我們有一個命名為MyModule的子產品,并且這各子產品有一些自己的配置。那麼我們首先要建立一些類,這些類定義為屬性(譯者注:屬性有自動的get和set通路器。),代表了不同的配置。
public class MyModuleConfig
{
public bool SampleConfig1 { get; set; }
public string SampleConfig2 { get; set; }
}
接下來,我們通過依賴注入,注冊這個類。
IocManager.Register<MyModuleConfig>(); //譯者注:在IocManager中注冊了一個類,換句話說,我們通過IocManager可以得到這個類MyModuleConfig的執行個體。至于IOC的原理這裡就不在詳細說了,總之,就是可以得到一個類的執行個體。
最後,我們通過建立一個擴充的方法IModuleConfigurations來得到配置的引用。如下代碼:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL2kzN5kTMygTMyEDMwEzMvwVNwUTMwIzLcRDMzQzM18CX1EDMyc2bsJ2Lc12bj5ycn9Gbi52YuAzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
譯者注:子產品配置是一個靜态類,因為我們需要重複使用它。靜态方法Mymodule傳回的是一個配置接口,參數是ImoduleConfigurations接口。
現在,在其他子產品中也可以配置我們自定義的這個MyModule子產品了。
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架構的系統中,所有的子產品都可以集中配置。
希望更多國内的架構師能關注到ABP這個項目,也許這其中有能幫助到您的地方,也許有您的參與,這個項目可以發展得更好。
歡迎加ABP架構設計交流QQ群:134710707