天天看點

X-Admin&ABP架構開發-設定管理

  在網站開發中,設定是不可缺少的一環,如使用者設定、系統設定、甚至是租戶設定等。ABP對于設定的管理已經做了很好的處理,我們可以借助巨人的力量來完成我們的冒險。

  ABP官網位址:https://aspnetboilerplate.com/

一、設定的層級劃分

  ABP中提供了三種類型的設定,使用者級别、應用級别、租戶級别,針對于不同級别有着不同的側重點,比如使用者級别,針對于使用者的一些設定,如主題設定,接收通知設定等;針對應用級别,該級别也能在使用者層級上進行影響,好比如設定統一的主題皮膚,而它主要展現在整個應用程式上的一些設定,如業務開發中用到的流水号自定義等,在應用程式級别進行配置;而針對租戶級别,可以為特定租戶完成設定(租戶級别個人暫沒有涉及到)。

  

X-Admin&ABP架構開發-設定管理

二、定義設定

1、先得定義設定才能使用設定,首先建立一個類并繼承SettingProvider類,ABP已經在Core層建立了一個AppSettingProvider類,直接使用該類即可,如果需要在其它子產品中(ABP是子產品化的)定義設定,可以直接參照這個類,并且在子產品中注冊即可。

/// <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";
}      

  為保證後期業務上的設定不産生影響,還是先進行區分好了,建立一個系統設定來維護一些相對于使用者和租戶而言獨立的應用層級的設定。

2、開始定義設定項資訊,從ABP官網文檔中看到有一個SettingDefinition類,用于定義設定項資訊,檢視該類建立時需要的參數

  • name:命名 (必填),命名必須系統内唯一,建議是用常量字元串;
  • defaultValue:預設值(選填),能為null或空字元串;
  • displayName:顯示名稱(選填),UI呈現上顯示的名稱;
  • group:分組(選填),可對同一類别的設定進行分組,用于UI上分組展示;
  • description: 設定項描述(選填),UI上呈現該設定項的描述資訊;
  • scopes:設定範圍(預設是應用層級),用于定義該設定項是用于哪一層級,該設定範圍可以歸屬多個層級;
  • isVisibleToClients:用戶端是否可見(預設false), 用戶端能否看見該設定及設定項值;
  • isInherited: 是否從父級設定項繼承(預設為true),當取值時可以從設定範圍上進行層級擷取;
  • customData: 自定義資料(選填),對于設定項設定自定義格式的資料;
  • clientVisibilityProvider:用戶端可見方式(預設不可見);
/// <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;
}      

   改造設定定義部分,使用從配置檔案中讀取的形式,此處可以給定預設值(選填)。

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中給與實作,并且配置好相關的權限設定。

[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給出了三個方法,直接調用即可,三個方法針對三個層級,按照實際使用調用即可。

  • ChangeSettingForApplicationAsync
  • ChangeSettingForTenantAsync
  • ChangeSettingForUserAsync

  在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中配置的預設值,其次更改儲存後,便是新的設定項值了。

  

X-Admin&amp;ABP架構開發-設定管理

  在網站首頁做了一次讀取設定項中的值,直接讀取的是更新後的公司名和公司位址了。

@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,望技術有成後能回來看見自己的腳步