ABP之Setting
介绍
每个应用程序都需要存储一些设置,并在应用程序的某个地方使用这些设置。ABP提供了一个强大的基础设施来存储/检索在服务器端和客户端都可用的应用程序、租户和用户级别设置。
设置是通常存储在数据库(或其他数据源)中的名称-值字符串对。我们可以通过将非字符串值转换为字符串来存储它。
关于ISettingStore
为了使用设置系统,必须实现ISettingStore接口。虽然我们可以用自己的方式实现它,但它完全是在Module Zero项目中实现的。如果没有实现,则从应用程序的配置文件(web.config或者 app.config)读取设置。但这些设置无法更改。限定范围也不起作用。
定义设置
设置必须在使用前定义。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,
clientVisibilityProvider: new VisibleSettingClientVisibilityProvider()
) };
}
}
GetSettingDefinitions 方法返回一个SettingDefinition对象. SettingDefinition 类在它的构造函数中有一些参数:
- 名称Name (必要的): setting名称必须是系统范围内的唯一 的。尽量使用一个常量字符串,而不是一个经常变化的字符串。
- Default value: 必须有一个默认值,默认值可以是null或者空的字符串。
- Scopes: 需要定义setting的范围。
- 显示名称Display name: 一个可本地化的字符串,可用于稍后在UI中显示设置的名称。
- 描述Description: 一个可本地化的字符串,可用于稍后在UI中显示设置的描述。
- 组Group:可用于组设置。这仅用于UI,不用于设置管理。
- ClientVisibilityProvider: 可用于确定是否可以在客户端上使用设置。
- isInherited: 用于确定该设置是否由租户和用户继承(请参阅设置范围部分)。
- customData: 可用于为该设置定义设置自定义数据。
在创建setting提供程序之后,必须在模块的PreIntialize方法中注册:
Configuration.Settings.Providers.Add<MySettingProvider>();
设置提供程序通过依赖注入自动注册。设置提供程序可以注入任何依赖项(如存储库),以使用其他源构建设置定义。
设置范围(Setting scope)
在SettingScopes enum枚举中定义了三个设置范围(或级别)
- 应用程序(Application):应用程序范围设置用于独立于用户/租户的设置。例如,我们可以定义一个名为“SmtpServerAddress”的设置,以便在发送电子邮件时获取服务器的IP地址。如果该设置只有一个值(不是根据用户进行更改),那么我们可以将其定义为应用程序范围。
- 租户(Tenant):如果应用程序是多租户的,我们可以定义特定于租户的设置。
- User:我们可以使用用户范围的设置来存储/获取特定于每个用户的设置的值。
settingscope enum有一个Flags属性,因此我们可以定义一个具有多个范围的设置。
默认情况下,设置范围是分层的(除非您将继承设置为false)。例如,如果我们将一个设置的范围定义为“Application | Tenant | User”,并试图获取该设置的当前值:
•如果为用户定义(覆盖)了特定于用户的值,我们将得到该值。
•如果没有,如果它为租户定义(覆盖),我们将得到租户特定的值.
•如果没有,我们将得到定义了的应用程序值。
•如果没有,我们将得到默认值。
默认值可以是null或空字符串。建议在可能的情况下为设置提供默认值。
服务器端(Server-side)
ISettingManager
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的属性。如果我们从这些类派生,就不需要显式地注入它。
ISettingDefinitionManager
ISettingDefinitionManager还可以用于获取AppSettingProvider中定义的设置定义。我们也可以在应用程序的任何地方注入并使用它。使用ISettingDefinitionManager可以获得定义名、默认值、显示名等等。
客户端
设置定义的ClientVisibilityProvider属性确定客户端设置的可见性。ISettingClientVisibilityProvider有四种实现。
- VisibleSettingClientVisibilityProvider:使设置定义对客户端可见。
- HiddenSettingClientVisibilityProvider:向客户端隐藏设置定义。
- RequiresAuthenticationSettingClientVisibilityProvider:当用户登录时,使设置定义对客户端可见。
- RequiresPermissionSettingClientVisibilityProvider:如果登录用户具有特定权限,则使设置定义对客户端可见。
如果根据设置定义的ClientVisibilityProvider的一个设置对客户端是可见的,那么您可以使用JavaScript在客户端获得它的当前值。 abp.setting命名空间定义了所需的函数和对象,例如:
var currentColor = abp.setting.get("SiteColorPreference");
还有getInt和getBoolean方法。您可以使用abp.setting.values对象获取所有值。注意,如果我们更改服务器端上的设置,客户端无法知道该更改,除非刷新页面、或以某种方式重新加载设置或通过代码手动更新设置。
改变设置
ISettingManager定义了ChangeSettingForApplicationAsync、ChangeSettingForTenantAsync和ChangeSettingForUserAsync方法(和同步版本),分别为应用程序、租户和用户更改设置。
关于缓存
设置管理器缓存设置在服务器端,因此我们不应该使用存储库或数据库更新语句直接更改设置值。
ABP之Setting的更多相关文章
- ABP源码分析七:Setting 以及 Mail
本文主要说明Setting的实现以及Mail这个功能模块如何使用Setting. 首先区分一下ABP中的Setting和Configuration. Setting一般用于需要通过外部配置文件(或数据 ...
- 设置ABP默认使用中文
ABP提供的启动模板, 默认使用是英文: 虽然可以通过右上角的菜单切换成中文, 但是对于国内项目来说, 默认使用中文是很正常的需求. 本文介绍了如何实现默认语言的几种方法, 希望能对ABP爱好者有所帮 ...
- ABP源码分析四十一:ZERO的Audit,Setting,Background Job
AuditLog: 继承自Entity<long>的实体类.封装AuditLog的信息. AuditingStore: 实现了IAuditingStore接口,实现了将AuditLog的信 ...
- ABP源码分析一:整体项目结构及目录
ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...
- ABP(现代ASP.NET样板开发框架)系列之9、ABP设置管理
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之9.ABP设置管理 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...
- 在ABP中创建Person实体类
经过之前的准备目前我们的项目,终于可以搞正式的开发工作了. 创建实体Person 在Core类库中添加Person类 /// <summary> /// 联系人 /// </summ ...
- ABP源码分析九:后台工作任务
文主要说明ABP中后台工作者模块(BackgroundWorker)的实现方式,和后台工作模块(BackgroundJob).ABP通过BackgroundWorkerManager来管理Backgr ...
- ABP源码分析二十:ApplicationService
IApplicationService : 空接口,起标识作用.所有实现了IApplicationService 的类都会被自动注入到容器中.同时所有IApplicationService对象都会被注 ...
- ABP源码分析二十四:Notification
NotificationDefinition: 用于封装Notification Definnition 的信息.注意和Notification 的区别,如果把Notification看成是具体的消息 ...
随机推荐
- twemproxy分片处理原理--剖析twemproxy代码正编
twemproxy在redis上能处理多命令流程只有mset,mget,del的命令,例如mset的话是mset k1 v1 k2 v2 k3 k3,mget的话是mget k1 k2 k3,del的 ...
- go 工具链目前[不支持编译 windows 下的动态链接库][1],不过[支持静态链接库][2]
go 工具链目前[不支持编译 windows 下的动态链接库][1],不过[支持静态链接库][2].想要产生dll,可以这样 workaround ,参考 golang [issuse#11058][ ...
- CMake生成OpenCV解决方案&&编译OpenCV源码
生成OpenCV工程需要用到CMake,所以第一步需要下载CMake软件,下载链接:CMake下载 目前最新的版本是3.7.1,这里选择下载Platform下的Windows win32-x86 ZI ...
- xshell登陆Win10 Linux子系统
原文:xshell登陆Win10 Linux子系统 版权声明:转载请注明出处 https://blog.csdn.net/anychenp/article/details/78922320 修改端口 ...
- 机器学习: Viola-Jones 人脸检测算法解析(一)
在计算机视觉领域中,人脸检测或者物体检测一直是一个非常受关注的领域,而在人脸检测中,Viola-Jones人脸检测算法可以说是非常经典的一个算法,所有从事人脸检测研究的人,都会熟悉了解这个算法,Vio ...
- ASP.NET Core 数据库上下文 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 数据库上下文 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 数据库上下文 上一章节中我们了解了 Entity Framewo ...
- Ubuntu 官方推荐源列表
如何使用Ubuntu Night Ubuntu Night( http://ubuntu9.com ) 的Top mirror功能根据当前的网络情况和源健康状况不断地进行更新当前可用的源的信息,包括 ...
- eclise配置tomcat出现服务Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4 and Java EE 5 Web modules
当部署项目Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, 1.5 and Java EE 5 Web modules错;解决方案,如下面: 空 ...
- XF 标签页面
using System; using Xamarin.Forms; using Xamarin.Forms.Xaml; [assembly: XamlCompilation (XamlCompila ...
- 【Gerrit】自动设置reviewer
gerrit 提供了一种代码review解决方案,但每次代码提交之后都要设置每个commit的code reviewer, 实在是痛苦. gerrit 在官方说明文档里面提供了解决方法,地址:http ...