X-Admin&ABP框架开发-设置管理
在网站开发中,设置是不可缺少的一环,如用户设置、系统设置、甚至是租户设置等。ABP对于设置的管理已经做了很好的处理,我们可以借助巨人的力量来完成我们的冒险。 ABP官网地址:https://aspnetboilerplate.com/ ? 一、设置的层级划分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类,用于定义设置项信息,查看该类创建时需要的参数
/// <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) ),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给出了三个方法,直接调用即可,三个方法针对三个层级,按照实际使用调用即可。
在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,望技术有成后能回来看见自己的脚步
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 你如何在ASP.NET中配置httpOnlyCookies?
- vbscript – 服务器端注释:ASP Classic中相当于<% - - %
- asp.net-mvc – 同步ASP.NET MVC回发回调的问题
- ASP.NET会话超时测试
- asp.net – tinymce在回发时获取HTML代码
- asp.net-membership – 在另一个站点中实现Umbraco成员资格
- asp.net-web-api – 将对象作为参数传递给Breeze控制器操作
- asp.net – 在DataTable.Select中使用BETWEEN
- asp.net – 使用sql helper时出现超时问题(Microsoft.Appli
- asp.net-mvc – NET 3.5 – MVC PetShop应用程序?
- asp.net mvc框架,自动发送电子邮件
- 在ASP.NET Web服务(ASMX)的JSON请求中,什么时候区
- asp.net-mvc – 如何手动创建简单的成员资格sql表
- 在ASP.net c#web应用程序中显示警告框
- asp.net-mvc-3 – asp.net mvc 3.0客户端验证无效
- asp.net – 在IIS7.5中不可见的无扩展名图像文件
- asp.net-mvc – Asp.Net MVC3 RC Razor视图:在块
- asp.net – 如何将HTML页面转换为.ASPX页面并向其
- 我可以创建一个不回发的ASP.NET ImageButton吗?
- asp.net-mvc-3 – System.Web.Mvc.HandleErrorIn