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看成是具体的消息 ...
随机推荐
- c语言学习笔记(10)——结构体
------------------------------------------------------------------ # include <stdio.h> struct ...
- QT 调用 DLL 方法(三种方法)
Qt调用DLL方法一:使用Win32 API 在显式链接下,应用程序必须进行函数 调用以在运行时显式加载 DLL.为显式链接到 DLL,应用程序必须:? 调用 LoadLibrary(或相似的函 数) ...
- WPF 3D model - Sphere, Cone, and Cylinder
原文:WPF 3D model - Sphere, Cone, and Cylinder Extending Visual3D - Sphere, Cone, and Cylinder http: ...
- WPF透明窗体制作
原文:WPF透明窗体制作 窗体的样式: <Grid Width="{Binding Width, ElementName=w}" Height="{Binding ...
- WPF 圆角textbox
原文:WPF 圆角textbox 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a771948524/article/details/9245965 ...
- 【HLSL学习笔记】WPF Shader Effect Library算法解读之[DirectionalBlur]
原文:[HLSL学习笔记]WPF Shader Effect Library算法解读之[DirectionalBlur] 方位模糊是一个按照指定角度循环位移并叠加纹理,最后平均颜色值并输出的一种特效. ...
- 【winows7+android-ndk-r9+Cygwin 】cocos2dx 2.*游戏移植Android平台完全手册
为了有不少走的弯路.这里简要记录cocos2d开发环境的搭建.android开发环境搭建.android NDK环境搭建.终于实现cocos2dx 2.* 游戏Android平台移植. 转载请注明出处 ...
- js 动态生成button 并设置click事件
<div id="MyDiv"></div> <script> function AddButton() { var MyDiv =docume ...
- 解压压缩文件报错gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now
压缩包是直接weget 后面加官网上的tar包地址获取的 [root@xuegod43 ~]# tar -zxvf /home/hadoop/hadoop-2.6.5-src.tar.gz gzip ...
- 如果你说最近在看《诛仙》,平时喜欢玩LOL,你就是在把自己往悬崖上推
面试官可能会问你一些和技术看上去没有任何关系的问题,比如问你最近在看什么书,学习之余喜欢做什么,常去哪些网站之类的.如果你说最近在看<诛仙>,平时喜欢玩LOL,你就是在把自己往悬崖上推.实 ...