设置管理

介绍

  每个应用都需要存储设置,并且在应用的某些地方需要使用这些设置。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,
isVisibleToClients: true
) };
}
}

  GetSettingDefinitions方法返回SettingDefinition对象。SettingDefinition类的构造函数里有一些参数:

  • Name(需要):一个设置必须有一个系统范围的唯一名称。建议为设置名称定义一个常量字符串而不是魔力字符串。
  • Default Value:设置应该有默认值。默认值可以为null或空字符串。
  • Scopes:设置应该有范围(参见下面部分)。
  • Display Name:本地化的字符串,可以用来在UI中显示的设置名称。
  • Description:本地化的字符串,可以用来在UI中显示设置的描述信息。
  • Group:用来进行组设置。仅对UI使用,在设置管理中没有用。
  • IsVisibleToClients:设置为true可以使设置在客户端可用。
  • IsInherited:用来决定设置是否通过租户或用户继承的(参见设置范围部分)。
  • CustomData:用来设置自定义数据。

  创建一个设置提供者之后,我们应该在模块的PreInitialize方法中注册:

Configuration.Settings.Providers.Add<MySettingProvider>();

  设置提供者自动注册到依赖注入系统。所以,设置提供者可以注入任何依赖项(比如仓储),使用其他资源来建造设置定义。

设置范围

  有三种设置范围(或级别),定义在SettingScopes枚举里:

  • Application:应用级别用来设置用户/租户无关的设置。例如,我们可以顶一个名为“SmtpServerAddress”的设置,当发送电邮的时候来获取服务器IP地址。如果这个设置只有一个值(不随用户改变),那么这个设置可以定义为应用级别。
  • Tenant:如果应用是多租户的,我们可以定义特定租户的设置。
  • User:我们可以使用用户范围的设置来存储/获取每一个特定用户的设置值。

  SettingScopes枚举有Flags特性,所以我们可以定义多余一种级别的设置。

  设置范围默认是分级的(除非设置isInherited为false)。例如,如果我们定义了一个设置的范围为“Application | Tenant | User”并且尝试获取这个设置的当前值:

  • 如果它定义(重写)为用户级别的,将得到特定用户的值。
  • 如果不是,将得到特定租户的值,如果它定义(重写)为租户级别的。
  • 如果不是,将得到应用值,如果定义了的话。
  • 如果不是,将得到默认值。

  默认值可以为null或空字符串。建议尽可能为设置提供默认值。

重写设置定义

  context.Manager可以用来获取设置定义并可改变设置值。使用这种方式,可以用来操作依赖模块的设置定义。

获取设置值

  定义一个设置之后,我们可以在服务端和客户端获取设置的当前值。

服务端

  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的属性。如果我们派生自这些类,就不需要显示的注入了。

客户端

  如果当定义设置时,将IsVisileToClients置为true,就可以在客户端使用javascript获取它的当前值。abp.setting命名空间定义了需要的函数和对象。例如:

var currentColor = abp.setting.get("SiteColorPreference");

  还有getInt和getBoolean方法。可以使用abp.setting.values对象获取所有的值。注意,如果在服务端更改了设置,客户端不会知道更改,除非页面刷新,设置可以以某种方式重新加载或者使用代码手动更新。

更改设置

  ISettingManager定义了ChangeSettingForApplicationAsyncChangeSettingForTenantAsync 和ChangeSettingForUserAsync 方法(和异步版本)用来更改应用、租户、用户的设置。

关于缓存

  设置管理器在服务端缓存设置。所以,我们可以使用仓储或数据库更新查询直接更改设置值。

返回主目录

ABP官方文档翻译 2.5 设置管理的更多相关文章

  1. ABP官方文档翻译 4.5 特征管理

    特征管理 介绍 关于IFeatureValueStore 特征类型 Boolean特征 Value特征 定义特征 基本特征属性 其他特征属性 特征层级 检查特征 使用RequiresFeature特性 ...

  2. 0.0 ABP官方文档翻译目录

    一直想学习ABP,但囿于工作比较忙,没有合适的契机,当然最重要的还是自己懒.不知不觉从毕业到参加工作七年了,没留下点儿什么,总感觉很遗憾,所以今天终于卯足劲鼓起勇气开始写博客.有些事能做的很好,但要跟 ...

  3. ABP官方文档翻译 10.1 ABP Nuget包

    ABP Nuget包 Packages Abp Abp.AspNetCore Abp.Web.Common Abp.Web Abp.Web.Mvc Abp.Web.Api Abp.Web.Api.OD ...

  4. ABP官方文档翻译 6.3 本地化

    本地化 介绍 应用程序语言 本地化源 XML文件 注册XML本地化源 JSON文件 注册JSON本地化源 资源文件 自定义源 当前语言是如何决定的 ASP.NET Core ASP.NET MVC 5 ...

  5. ABP官方文档翻译 3.6 工作单元

    工作单元 介绍 ABP中的连接和事务管理 传统的工作单元方法 控制工作单元 UnitOfWork特性 IUnitOfWorkManager 工作单元详情 禁用工作单元 无事务工作单元 一个工作单元方法 ...

  6. ABP官方文档翻译 0.0 ABP官方文档翻译目录

    一直想学习ABP,但囿于工作比较忙,没有合适的契机,当然最重要的还是自己懒.不知不觉从毕业到参加工作七年了,没留下点儿什么,总感觉很遗憾,所以今天终于卯足劲鼓起勇气开始写博客.有些事能做的很好,但要跟 ...

  7. ABP官方文档翻译 1.1 介绍

    介绍 介绍 快速示例 其他 启动模板 如何使用 介绍 我们通常会根据不同的需求来创建不同的应用程序.但是对于一些通用相似的结构总是一遍又一遍的实现,至少在某种程度上是这样的.常见的通用模块如授权.验证 ...

  8. ABP官方文档翻译 1.5 多租户

    多租户 什么是多租户? 数据库和部署架构 多部署-多数据库 单部署-多数据库 单部署-单数据库 单部署-混合数据库 多部署-单/多/混合数据库 ABP的多租户 启用多租户 租主和租户 会话 决定当前租 ...

  9. ABP官方文档翻译 7.1 后台Jobs和Workers

    后台Jobs和Workers 介绍 后台Jobs 关于Job持久化 创建后台Job 在队列中添加一个新Job 默认的后台Job管理器 后台Job存储 配置 禁用Job执行 异常处理 Hangfire集 ...

随机推荐

  1. [SQL] SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式

    SQL 基础知识梳理(六)-  函数.谓词.CASE 表达式 目录 函数 谓词 CASE 表达式 一.函数 1.函数:输入某一值得到相应输出结果的功能,输入值称为“参数”,输出值称为“返回值”. 2. ...

  2. 【好记性不如烂笔头】死锁之java代码

    死锁: 是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称 ...

  3. 走入PHP-declare、ticks、encoding、include

    declare 结构用来设定一段代码的执行指令.declare 的语法和其它流程控制结构相似(该代码为语法格式,不是代码案例,无需敲打该代码): declare (directive) stateme ...

  4. WEB开发性能优化--核心定义介绍篇(1)

    推荐理由 随着 互联网的蓬勃发展,并且伴随着产品功能的越来越复杂,对于技术人员来说最大的挑战就是如何在保证业务快速发展的同时,也可保证不断复杂的业务对用户体验的影响,其中对用户来说最重要的体验指标是如 ...

  5. ubuntu-terminal快捷键

    常用快捷键功能:Tab 自动补全 Ctrl+a 光标移动到开始位置 Ctrl+e 光标移动到最末尾 Ctrl+k 删除此处至末尾的所有内容 Ctrl+u 删除此处至开始的所有内容 Ctrl+d 删除当 ...

  6. 机器学习:python中如何使用朴素贝叶斯算法

    这里再重复一下标题为什么是"使用"而不是"实现": 首先,专业人士提供的算法比我们自己写的算法无论是效率还是正确率上都要高. 其次,对于数学不好的人来说,为了实 ...

  7. div内部元素居中

    要让div内部元素垂直居中,则给div加上此css样式: .div-vertical-middle{  height:200px;  width:304px;  line-height:50px;  ...

  8. Linux命令速查大全

    常用基本命令 ls 显示文件或目录 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录,包括隐藏的a(all) mkdir 创建目录 -p 创建目录,若无父目录,则创建p(par ...

  9. 【G】开源的分布式部署解决方案文档 - Web Deploy

    G.系列导航 [G]开源的分布式部署解决方案 - 导航 微软官方部署方式 右键项目->发布 这个大家应该再熟悉不过,在部署前有个预览界面可以看本次更新到底更新哪些文件. 既然它可以预览部署结果, ...

  10. 5 安装Alloc服务

    cnblogs-DOC 1.服务器环境 2.安装Redis3.安装Zookeeper4.安装MPush5.安装Alloc服务6.完整测试7.常见问题 一.Linux安装Mpush-Alloc [roo ...