设置管理

介绍

  每个应用都需要存储设置,并且在应用的某些地方需要使用这些设置。ABP提供了一个强大的在服务端和客户端都可以使用的基础设施存储/获取应用、租户和用户级别的设置。

  一个设置是一个名称-值字符串对,一般存放在数据库(或其他源)。我们可以存储非字符串值,但需要把他们转换成字符串。

关于 ISettingStore

  为了使用设置系统,ISettingStore接口必须实现。虽然可以用自己的方式实现,但是module-zero工程已经完整的实现了它。如果没有实现的话,将会从应用的配置文件(web.config或app.config)读取配置,但是不能改变任何设置。设置范围也不会起作用。

定义设置

  设置在使用前必须先定义。ABP设计为模块的。所以,不同的模块有不同的设置。模块应该创建一个集成子SettingProvider的类,以便定义设置。设置提供者的示例如下:

  1. public class MySettingProvider : SettingProvider
  2. {
  3. public override IEnumerable<SettingDefinition> GetSettingDefinitions(SettingDefinitionProviderContext context)
  4. {
  5. return new[]
  6. {
  7. new SettingDefinition(
  8. "SmtpServerAddress",
  9. "127.0.0.1"
  10. ),
  11.  
  12. new SettingDefinition(
  13. "PassiveUsersCanNotLogin",
  14. "true",
  15. scopes: SettingScopes.Application | SettingScopes.Tenant
  16. ),
  17.  
  18. new SettingDefinition(
  19. "SiteColorPreference",
  20. "red",
  21. scopes: SettingScopes.User,
  22. isVisibleToClients: true
  23. )
  24.  
  25. };
  26. }
  27. }

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

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

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

  1. 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用来异步调用)。它返回设置的当前值,基于默认值、应用、租户和用户设置(如在先前设置范围部分描述的)。例如:

  1. //Getting a boolean value (async call)
  2. var value1 = await SettingManager.GetSettingValueAsync<bool>("PassiveUsersCanNotLogin");
  3.  
  4. //Getting a string value (sync call)
  5. var value2 = SettingManager.GetSettingValue("SmtpServerAddress");

  GetSettingValue有泛型和异步版本,如上所示。也有方法可以获取特定租户或用户设置值、所有设置值的列表。

  因为ISettingManager被广泛使用,一些特定的基类(如ApplicationService,DomainService和AbpController)有一个名为SettingManager的属性。如果我们派生自这些类,就不需要显示的注入了。

客户端

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

  1. 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. 简单的add函数的N种写法

    最近在学习es6,看到for-of这里,就想自己写着练习一下,于是就准备写一个小函数add来求和.函数很简单,如add(1,2,3)这样.于是我开始着手 一开始我是这么写的 function add( ...

  2. Spring使用注解进行事务的管理

    使用步骤: 步骤一.在spring配置文件中引入<tx:>命名空间 <beans xmlns="http://www.springframework.org/schema/ ...

  3. self-question

    需要即刻提升的几大能力: 1.重装系统和安装各种软件 2.自学能力,多从实际案例中总结,多归纳反思 3.拓展人际关系,和别人沟通交流 4.遇到困难迎刃而上,而不是回避退缩

  4. ICC_lab总结——ICC_lab3:布局

    PS:字丑,禁止转载. 做到了ICC workshop的第三个实验,理论与实践相结合,于是,先放一张总结图,这张总结图来自前面的博客,放在这里用来体现理论和实践的联系: 这个就是布局的理论部分,在IC ...

  5. 如何用正确的姿势查看 主机系统的CPU信息

    一.关于CPU的几个概念 CPU的作用 计算机中的中央处理单元(CPU)执行基本的计算工作 -- 运行程序.但是,一个单核的CPU同一时间只能一次执行一个任务,为了提高计算机的处理能力,也就出现了多C ...

  6. 定时任务框架APScheduler学习详解

    APScheduler简介 在平常的工作中几乎有一半的功能模块都需要定时任务来推动,例如项目中有一个定时统计程序,定时爬出网站的URL程序,定时检测钓鱼网站的程序等等,都涉及到了关于定时任务的问题,第 ...

  7. Failed to connect to Xilinx hw_server. Check if the hw_server is running and correct TCP port is used.

    Failed to connect to Xilinx hw_server. Check if the  hw_server is running and correct TCP port is us ...

  8. ios微信自动播放音乐

    <!DOCTYPE html> <html> <head lang="en">     <meta charset="UTF-8 ...

  9. 于普通用户启动UAC问题

    在VS中设置UAC级别操作如下: 项目属性-配置属性-连接器-清单文件 1.UAC执行级别: aslnvoker: 权限级别最低,不需要管理员身份. highestAvailable:获取最高权限执行 ...

  10. OpenStack及其构成简介

    新的一年新的开始,突然想学习下Openstack,之前了解过很多,但是想系统的学习一下,第一次写博客,只想把学到的东西记录下来加深印象,如有写的不好的地方请多多见谅.下面开门见山. 1.What is ...