在網(wǎng)站開發(fā)中,設置是不可缺少的一環(huán),如用戶設置、系統(tǒng)設置、甚至是租戶設置等。ABP對于設置的管理已經(jīng)做了很好的處理,我們可以借助巨人的力量來完成我們的冒險。
ABP官網(wǎng)地址:https://aspnetboilerplate.com/ <https://aspnetboilerplate.com/>
?
一、設置的層級劃分
ABP中提供了三種類型的設置,用戶級別、應用級別、租戶級別,針對于不同級別有著不同的側(cè)重點,比如用戶級別,針對于用戶的一些設置,如主題設置,接收通知設置等;針對應用級別,該級別也能在用戶層級上進行影響,好比如設置統(tǒng)一的主題皮膚,而它主要體現(xiàn)在整個應用程序上的一些設置,如業(yè)務開發(fā)中用到的流水號自定義等,在應用程序級別進行配置;而針對租戶級別,可以為特定租戶完成設置(租戶級別個人暫沒有涉及到)。
?
二、定義設置
1、
先得定義設置才能使用設置,首先創(chuàng)建一個類并繼承SettingProvider類,ABP已經(jīng)在Core層創(chuàng)建了一個AppSettingProvider類,直接使用該類即可,如果需要在其它模塊中(ABP是模塊化的)定義設置,可以直接參照這個類,并且在模塊中注冊即可。
/// <summary> /// 設置命名 /// </summary> public static class AppSettingNames { ///
<summary> /// 系統(tǒng)管理 /// </summary> public static class HostManagement { public
const string CompanyName = "App.CompanyName"; public const string
CompanyAddress ="App.CompanyAddress"; } public const string UiTheme = "
App.UiTheme"; }
為保證后期業(yè)務上的設置不產(chǎn)生影響,還是先進行區(qū)分好了,建立一個系統(tǒng)設置來維護一些相對于用戶和租戶而言獨立的應用層級的設置。
?
2、開始定義設置項信息,從ABP官網(wǎng)文檔中看到有一個SettingDefinition類,用于定義設置項信息,查看該類創(chuàng)建時需要的參數(shù)
* name:命名 (必填),命名必須系統(tǒng)內(nèi)唯一,建議是用常量字符串;
* defaultValue:默認值(選填),能為null或空字符串;
* displayName:顯示名稱(選填),UI呈現(xiàn)上顯示的名稱;
* group:分組(選填),可對同一類別的設置進行分組,用于UI上分組展示;
* description: 設置項描述(選填),UI上呈現(xiàn)該設置項的描述信息;
* scopes:設置范圍(默認是應用層級),用于定義該設置項是用于哪一層級,該設置范圍可以歸屬多個層級;
* isVisibleToClients:客戶端是否可見(默認false),?客戶端能否看見該設置及設置項值;
* isInherited: 是否從父級設置項繼承(默認為true),當取值時可以從設置范圍上進行層級獲??;
* customData: 自定義數(shù)據(jù)(選填),對于設置項設置自定義格式的數(shù)據(jù);
* clientVisibilityProvider:客戶端可見方式(默認不可見); /// <summary> /// 獲取系統(tǒng)管理設置 ///
</summary> /// <returns></returns> private IEnumerable<SettingDefinition>
GetHostSettings() {return new[] { new SettingDefinition(
AppSettingNames.HostManagement.CompanyName,"星城科技" ), new SettingDefinition(
AppSettingNames.HostManagement.CompanyAddress,"湖南長沙" ), }; }
? 首先來定義兩個簡單的設置項,其中默認值直接寫死了,這種做法顯得太low了,一般來講,是需要寫到配置文件中的,因此對這一塊進行改造,增加從配置文件中根據(jù)設置項名稱讀取默認值的功能,參照Abp
Zero中的一些代碼,CV操作到Abp中,新增一個接口IAppConfigurationAccessor并增加一個實現(xiàn)AppConfigurationAccessor。
public class AppConfigurationAccessor : IAppConfigurationAccessor,
ISingletonDependency {public IConfigurationRoot Configuration { get; } public
AppConfigurationAccessor() { Configuration=
AppConfigurations.Get(Directory.GetCurrentDirectory()); } }
? 然后在定義設置類中引入對配置文件的操作,如果給定的設置項名稱存在于配置文件中(appsetting.json或其它環(huán)境下的該文件),那么先讀取配置文件中的值,讀取不到使用默認值。
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; }
? 改造設置定義部分,使用從配置文件中讀取的形式,此處可以給定默認值(選填)。
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在應用層已經(jīng)封裝了一些設置的常用操作,我們需要做的只是在這基礎上,擴展加入的設置項,在IConfigurationAppService中添加獲取系統(tǒng)設置及更新系統(tǒng)設置的方法聲明,并在ConfigurationAppService中給與實現(xiàn),并且配置好相關的權限設置。
[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給出了三個方法,直接調(diào)用即可,三個方法針對三個層級,按照實際使用調(diào)用即可。
* ChangeSettingForApplicationAsync
* ChangeSettingForTenantAsync
* ChangeSettingForUserAsync
在MVC層增加系統(tǒng)設置控制器,并完成系統(tǒng)設置的讀取和更新操作。
/// <summary> /// 系統(tǒng)設置控制器 /// </summary> [AbpMvcAuthorize] public class
HostSettingsController : SurroundControllerBase {private readonly
IConfigurationAppService _configurationAppService;public
HostSettingsController(IConfigurationAppService configurationAppService) {
_configurationAppService= configurationAppService; } /// <summary> /// 系統(tǒng)設置首頁
/// </summary> /// <returns></returns> public async Task<IActionResult> Index()
{var settings = await _configurationAppService.GetAllHostSettings(); return
View(settings); }/// <summary> /// 更新系統(tǒng)設置 /// </summary> /// <param
name="input"></param> /// <returns></returns> [HttpPost] public async Task
UpdateAllSettings([FromBody]HostSettingsEditDto input) {await
_configurationAppService.UpdateAllHostSettings(input); } }
? 增加視圖文件并在頁面上通過tab完成對設置類型的區(qū)分,初次進入頁面加載的是從appsetting.json中配置的默認值,其次更改保存后,便是新的設置項值了。
在網(wǎng)站主頁做了一次讀取設置項中的值,直接讀取的是更新后的公司名和公司地址了。
@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
<https://gitee.com/530521314/Partner.Surround.git>
?
2019-08-11,望技術有成后能回來看見自己的腳步
熱門工具 換一換