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看成是具体的消息 ...
随机推荐
- Android开发中如何加载API源码帮助开发
在eclipse中添加android源码既可以帮助我们的开发,又能使我们边开发边学习. android环境的搭建:http://blog.csdn.net/dawanganban/article/de ...
- 【每日一句】make a scene
scene有场面.场景的意思,只是make a scene可不是指做场面.scene还有还有一个意思,指很生气而大吵大闹(的情景),因此make a scene就是指某人情绪失控发脾气.如今一起从以下 ...
- 实用的 Matlab
activecontour:前景背景分离,Segment image into foreground and background using active contour 该函数返回的是一副 bin ...
- Blend_技巧篇_导入PSD文件制作ToggleButton (Z)
原文:Blend_技巧篇_导入PSD文件制作ToggleButton (Z) 系统: Win7sp1 32位 IDE: Microsoft VisualStudio 2013 Ultimate Ble ...
- 从源码角度看MySQL memcached plugin——1. 系统结构和引擎初始化
本章尝试回答两个问题: 一.memcached plugin与MySQL的关系: 二.MySQL系统如何启动memcached plugin. 1. memcached plugin与MySQL的关系 ...
- GoldenGate过程 abend,报错OGG-00868 ORA-02396: Exceeded Maximum Idle Time, Please Connect Again
GoldenGate过程 abend,报错OGG-00868 ORA-02396: Exceeded Maximum Idle Time, Please Connect Again 参考原始: Gol ...
- 从Header中获得信息
/// <summary> /// 获得header信息 /// </summary> /// <param name="response">& ...
- DataContext和ItemSource
一对多的关系DataContext为上下文,绑定数据源ItemSource取上下文中的某属性,会一级一级往上找属性 一般ItemSource的绑定,绑定到Grid/DataGrid一类容器上,底下的控 ...
- Keil5生成bin文件
进入“Options for Target”设置界面如下: 如图所示方框中输入: fromelf.exe --bin -o "$L@L.bin" "#L" 生成 ...
- SQLServer 事务复制中使用脚本添加某个对象的发布
原文:SQLServer 事务复制中使用脚本添加某个对象的发布 -- use [发布库] --添加表:创建项目并将其添加到发布中 exec sp_addarticle @publication = N ...