ABP(现代ASP.NET样板开发框架)系列之9、ABP设置管理
基于DDD的现代ASP.NET开发框架--ABP系列之9、ABP设置管理
ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。
ABP的官方网站:http://www.aspnetboilerplate.com
ABP在Github上的开源项目:https://github.com/aspnetboilerplate
本文由山东-李伟提供翻译
介绍
每个应用程序需要存储一些设置并在应用程序的某个地方使用这些设置。ABP框架提供强大的基础架构,我们可以在服务端或者客户端设置,来存储/获取应用程序、 租户和用户级别的配置。
设置通常是存储在数据库(或另一个来源)中,用名称-值(name-value)字符串对应的结构来表示。我们可以把非字符串值转换成字符串值来存储。
注意:关于ISettingStore接口
为了使用设置管理必须实现 ISettingStore 接口。你可以用自己的方式实现它,在module-zero项目中有完整的实现可以参考。
定义设置
使用设置之前必须要先定义。ABP框架是模块化设计,所以不同的模块可以有不同的设置。为了定义模块自己的设置,每个模块都应该创建继承自SettingProvider 的派生类。设置提供程序示例如下所示:
public class MySettingProvider : SettingProvider
{
public override IEnumerable<SettingDefinition> GetSettingDefinitions(SettingDefinitionProviderContext context)
{
return new[]
{
new SettingDefinition(
"SmtpServerAddress",
"127.0.0.1"
), new SettingDefinition(
"PassiveUsersCanNotLogin",
"true",
scopes: SettingScopes.Application | SettingScopes.Tenant
), new SettingDefinition(
"SiteColorPreference",
"red",
scopes: SettingScopes.User,
isVisibleToClients: true
)
};
}
}
GetSettingDefinitions 方法返回 SettingDefinition 对象。SettingDefinition 类的构造函数中有如下参数:
- Name (必填):必须具有全系统唯一的名称。比较好的办法是定义字符串常量来设置Name。
- Default value: 设置一个默认值。此值可以是null 或空字符串。
- Scopes: 定义设置的范围 (见下文)。
- Display name: 一个可本地化的字符串,用于以后在UI中显示设置的名称。
- Description: 一个可本地化的字符串,用于以后在UI中显示设置的描述。
- Group: 可用于设置组。这仅仅是UI使用,不用于设置管理。
- IsVisibleToClients: 设置为 true 将使设置在客户端可用。
在创建设置提供程序(SettingProvider)之后,我们应该在预初始化(PreIntialize)方法中注册我们的模块:
Configuration.Settings.Providers.Add<MySettingProvider>();
设置提供程序会自动注册依赖注入。所以,设置提供程序可以注入任何依赖项 (如存储库) 来生成设置定义的一些其它来源。
设置范围
有三个设置范围 (或级别) 在 SettingScopes 枚举中定义:
- Application:应用程序范围设置用于用户/租户独立的设置。例如,我们可以定义一个名为"SmtpServerAddress"的设置,当发送电子邮件时,获取服务器的 IP 地址。如果此设置有一个单一的值 (不基于用户改变),那么我们可以定义它为应用程序范围。
- Tenant:如果应用程序是多租户的,我们可以定义特定于租户的设置。
- User:我们可以使用的用户范围的设置来为每个用户存储/获取设置的值。
SettingScopes 枚举具有Flags属性,所以我们可以定义一个具有多个作用域的设置。
设置范围是分层的。例如,如果我们定义设置范围为"Application | Tenant | User"并尝试获取当前设置的值;
- 我们获取特定用户的值,如果它定义 (重写) User。
- 如果没有,我们获取特定的租户值,如果它定义 (重写) Tenant。
- 如果没有,我们获取应用的值,如果它定义Application。
- 如果没有,我们得到的默认值。
默认值可以是 null 或空字符串。如果可以,建议为设置提供一个默认值。
获取设置值
定义设置后,我们可以在服务器和客户端获取到它的当前值。
(1)服务器端(Server side)
ISettingManager 用于执行设置操作。我们可以在应用程序中任何地方注入和使用它。ISettingManager 定义了很多获取设置值方法。
最常用的方法是 GetSettingValue (或GetSettingValueAsync 为异步调用)。它将返回当前设置的基于默认值、 应用程序、 租户和用户设置范围的值(如设置范围之前的一段中所述)。例子:
//Getting a boolean value (async call)
var value1 = await SettingManager.GetSettingValueAsync<bool>("PassiveUsersCanNotLogin");
//Getting a string value (sync call)
var value2 = SettingManager.GetSettingValue("SmtpServerAddress");
GetSettingValue 有泛型和异步版本,如上所示。也有方法来获取特定的租户或用户的设置值或所有设置值的列表。
由于ISettingManager使用广泛,一些特定的基类 (如 ApplicationService、 DomainService 和 AbpController) 有一个名为 SettingManager的属性。如果我们从这些类继承,就无需显式地注入它。
(2)客户端
如果定义设置时将 IsVisibleToClients 设置为 true,就可以在客户端使用 javascript得到它的当前值。abp.setting 命名空间定义所需的函数和对象。示例:
var currentColor = abp.setting.get("SiteColorPreference");
也有 getInt 和 getBoolean 这样的方法。你可以使用 abp.setting.values 对象获取所有值。请注意,如果你在服务器端更改设置,客户端不会知道这种变化,除非刷新页面或者以某种方式重新加载页面或者通过代码手动更新。
更改设置
ISettingManager 定义了 ChangeSettingForApplicationAsync,ChangeSettingForTenantAsync 和 ChangeSettingForUserAsync 方法(以及同步版本)来更改应用程序,租户和用户分别的设置。
关于缓存
缓存在服务器端设置管理,所以,我们不应直接使用存储库或数据库更新语句改变设置的值。
希望更多国内的架构师能关注到ABP这个项目,也许这其中有能帮助到您的地方,也许有您的参与,这个项目可以发展得更好。
欢迎加ABP架构设计交流QQ群:134710707

ABP(现代ASP.NET样板开发框架)系列之9、ABP设置管理的更多相关文章
- ABP(现代ASP.NET样板开发框架)系列之18、ABP应用层——权限验证
点这里进入ABP系列文章总目录 ABP(现代ASP.NET样板开发框架)系列之18.ABP应用层——权限验证 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目 ...
- ABP(现代ASP.NET样板开发框架)系列之20、ABP展现层——动态生成WebApi
点这里进入ABP系列文章总目录 ABP(现代ASP.NET样板开发框架)系列之20.ABP展现层——动态生成WebApi ABP是“ASP.NET Boilerplate Project (ASP.N ...
- ABP(现代ASP.NET样板开发框架)系列之3、ABP分层架构
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之3.ABP分层架构 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...
- ABP(现代ASP.NET样板开发框架)系列之4、ABP模块系统
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之4.ABP模块系统 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...
- ABP(现代ASP.NET样板开发框架)系列之5、ABP启动配置
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之5.ABP启动配置 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...
- ABP(现代ASP.NET样板开发框架)系列之6、ABP依赖注入
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之6.ABP依赖注入 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...
- ABP(现代ASP.NET样板开发框架)系列之7、ABP Session管理
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之7.ABP Session管理 ABP是“ASP.NET Boilerplate Project (ASP.NET ...
- ABP(现代ASP.NET样板开发框架)系列之8、ABP日志管理
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之8.ABP日志管理 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...
- ABP(现代ASP.NET样板开发框架)系列之10、ABP领域层——实体
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之10.ABP领域层——实体 ABP是“ASP.NET Boilerplate Project (ASP.NET样板 ...
随机推荐
- DDD初学指南
去年就打算总结一下,结果新换的工作特别忙,就迟迟没有认真动手.主要内容是很多初学DDD甚至于学习很长时间的同学没有弄明白DDD是什么,适合什么情况.这世界上没有银弹,抛开了适合的场景孤立的去研究DDD ...
- [.NET] 打造一个很简单的文档转换器 - 使用组件 Spire.Office
打造一个很简单的文档转换器 - 使用组件 Spire.Office [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6024827.html 序 之前,& ...
- 如何避免git每次提交都输入密码
在ubuntu系统中,如何避免git每次提交都输入用户名和密码?操作步聚如下:1: cd 回车: 进入当前用户目录下:2: vim .git-credentials (如果没有安装vim 用其它编辑器 ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- java中Action层、Service层和Dao层的功能区分
Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- iOS 后台处理
iOS 后台处理的常见用途 1.进入后台时候删除资源:应用处于挂起状态的时候所占用的资源越少,该应用被iOS终止的风险就越低.通过从内存中清理那些易于重新创建的资源,可以增加应用驻留内存的机会,因此可 ...
- 用javascript写星际飞机大战游戏
在github里看到了个不错的脚本游戏,决定亲自动手来写,效果如下 下面是代码的思路分享 把整个代码理解消化确实不容易,但是如果你坚持看完相信你一定会有收获 如果没兴趣可以直接点击下面的链接 复制代码 ...
- org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): da.huying.usermanag ...
- .NET跨平台之旅:数据库连接字符串写法引发的问题
最近在一个ASP.NET Core站点中遇到一个奇怪问题.当用dotnet run命令启动站点后,开始的一段时间请求执行速度超慢,有时要超过20秒,有时甚至超过1分钟,日志中会记录这样的错误: Sys ...