在網站開發中,設置是不可缺乏的一環,如用戶設置、系統設置、甚至是租戶設置等。ABP對於設置的管理已經作了很好的處理,咱們能夠藉助巨人的力量來完成咱們的冒險。java
ABP官網地址:https://aspnetboilerplate.com/git
ABP中提供了三種類型的設置,用戶級別、應用級別、租戶級別,針對於不一樣級別有着不一樣的側重點,好比用戶級別,針對於用戶的一些設置,如主題設置,接收通知設置等;針對應用級別,該級別也能在用戶層級上進行影響,比如如設置統一的主題皮膚,而它主要體如今整個應用程序上的一些設置,如業務開發中用到的流水號自定義等,在應用程序級別進行配置;而針對租戶級別,能夠爲特定租戶完成設置(租戶級別我的暫沒有涉及到)。json
一、先得定義設置才能使用設置,首先建立一個類並繼承SettingProvider類,ABP已經在Core層建立了一個AppSettingProvider類,直接使用該類便可,若是須要在其它模塊中(ABP是模塊化的)定義設置,能夠直接參照這個類,而且在模塊中註冊便可。app
/// <summary> /// 設置命名 /// </summary> public static class AppSettingNames { /// <summary> /// 系統管理 /// </summary> public static class HostManagement { public const string CompanyName = "App.CompanyName"; public const string CompanyAddress = "App.CompanyAddress"; } public const string UiTheme = "App.UiTheme"; }
爲保證後期業務上的設置不產生影響,仍是先進行區分好了,創建一個系統設置來維護一些相對於用戶和租戶而言獨立的應用層級的設置。async
二、開始定義設置項信息,從ABP官網文檔中看到有一個SettingDefinition類,用於定義設置項信息,查看該類建立時須要的參數ide
/// <summary> /// 獲取系統管理設置 /// </summary> /// <returns></returns> private IEnumerable<SettingDefinition> GetHostSettings() { return new[] { new SettingDefinition( AppSettingNames.HostManagement.CompanyName, "星城科技" ), new SettingDefinition( AppSettingNames.HostManagement.CompanyAddress, "湖南長沙" ), }; }
首先來定義兩個簡單的設置項,其中默認值直接寫死了,這種作法顯得太low了,通常來說,是須要寫到配置文件中的,所以對這一塊進行改造,增長從配置文件中根據設置項名稱讀取默認值的功能,參照Abp Zero中的一些代碼,CV操做到Abp中,新增一個接口IAppConfigurationAccessor並增長一個實現AppConfigurationAccessor。模塊化
public class AppConfigurationAccessor : IAppConfigurationAccessor, ISingletonDependency { public IConfigurationRoot Configuration { get; } public AppConfigurationAccessor() { Configuration = AppConfigurations.Get(Directory.GetCurrentDirectory()); } }
而後在定義設置類中引入對配置文件的操做,若是給定的設置項名稱存在於配置文件中(appsetting.json或其它環境下的該文件),那麼先讀取配置文件中的值,讀取不到使用默認值。網站
private string GetFromAppSettings(string name, string defaultValue = null) { return GetFromSettings("App:" + name, defaultValue); } private string GetFromSettings(string name, string defaultValue = null) { return _appConfiguration[name] ?? defaultValue; }
改造設置定義部分,使用從配置文件中讀取的形式,此處能夠給定默認值(選填)。spa
private IEnumerable<SettingDefinition> GetHostSettings() { return new[] { new SettingDefinition( AppSettingNames.HostManagement.CompanyName, GetFromSettings(AppSettingNames.HostManagement.CompanyName) ), new SettingDefinition( AppSettingNames.HostManagement.CompanyAddress, GetFromSettings(AppSettingNames.HostManagement.CompanyAddress) ), }; }
ABP在應用層已經封裝了一些設置的經常使用操做,咱們須要作的只是在這基礎上,擴展加入的設置項,在IConfigurationAppService中添加獲取系統設置及更新系統設置的方法聲明,並在ConfigurationAppService中給與實現,而且配置好相關的權限設置。code
[AbpAuthorize(PermissionNames.Pages_HostSettings)] public async Task<HostSettingsEditDto> GetAllHostSettings() { return new HostSettingsEditDto { CompanySettingsEditDto = await GetCompanySettingsAsync() }; } [AbpAuthorize(PermissionNames.Pages_HostSettings)] public async Task UpdateAllHostSettings(HostSettingsEditDto input) { await UpdateCompanySettingsAsync(input.CompanySettingsEditDto); }
此處對於設置的管理是將所有設置讀出,並所有寫入完成更新,而不是採用單個更新形式,固然也能改爲一個一個配置,可是操做上相對繁瑣,針對設置的更新,ABP給出了三個方法,直接調用便可,三個方法針對三個層級,按照實際使用調用便可。
在MVC層增長系統設置控制器,並完成系統設置的讀取和更新操做。
/// <summary> /// 系統設置控制器 /// </summary> [AbpMvcAuthorize] public class HostSettingsController : SurroundControllerBase { private readonly IConfigurationAppService _configurationAppService; public HostSettingsController(IConfigurationAppService configurationAppService) { _configurationAppService = configurationAppService; } /// <summary> /// 系統設置首頁 /// </summary> /// <returns></returns> public async Task<IActionResult> Index() { var settings = await _configurationAppService.GetAllHostSettings(); return View(settings); } /// <summary> /// 更新系統設置 /// </summary> /// <param name="input"></param> /// <returns></returns> [HttpPost] public async Task UpdateAllSettings([FromBody]HostSettingsEditDto input) { await _configurationAppService.UpdateAllHostSettings(input); } }
增長視圖文件並在頁面上經過tab完成對設置類型的區分,初次進入頁面加載的是從appsetting.json中配置的默認值,其次更改保存後,即是新的設置項值了。
在網站主頁作了一次讀取設置項中的值,直接讀取的是更新後的公司名和公司地址了。
@using Partner.Surround.Configuration @{ var companyName = await SettingManager.GetSettingValueForApplicationAsync(AppSettingNames.HostManagement.CompanyName); var companyAddress = await SettingManager.GetSettingValueForApplicationAsync(AppSettingNames.HostManagement.CompanyAddress); }
至此,設置管理的頁面配置完成了,當前設置主要是對應用層級的設置,對用戶這一級沒有作太多展現,可是原理是同樣的,對於像分組設置,設置項描述等信息,能夠在此基礎上進行擴展,畢竟身後有巨人。
代碼地址:https://gitee.com/530521314/Partner.Surround.git
2019-08-11,望技術有成後能回來看見本身的腳步