设置管理

介绍

  每个应用都需要存储设置,并且在应用的某些地方需要使用这些设置。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. mybatis只能模糊查询英文不能查询中文

    解决方法:修改配置文件,最简单的完美修改方法,修改mysql的my.cnf文件中的字符集键值(注意配置的字段细节): 1.在[client]字段里加入default-character-set=utf ...

  2. 字符集&各种编码&编码解码

    要理解乱码问题,首先需要理解几个概念:字符集.编码.编码规则.乱码 1. 字符集: 字符(Character)是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.字符集(Charact ...

  3. Java实现非递归删除目录

    最近在学C#的文件系统, 发现C#的文件系统貌似比java的东西少一点, 居然连删除目录都直接做好封装了, 想到学java的时候还要自己写递归删除, 好像没写过非递归的,就在网上查了下, 关于非递归删 ...

  4. virtualenv 安装不同版本的虚拟环境的办法

    废话不多说直接上代码 virtualenv -p C:\Python27\python2.exe env 上面的*.exe是你要使用的python版本的exe文件的绝对路径. 官方文档参考:http: ...

  5. redis 3.2 报错 Redis protected-mode 配置文件没有真正启动

    (error) DENIED Redis is running in protected mode because protected mode is enabled Redis protected- ...

  6. CSS媒体查询适配范例

    /*orientation:portrait纵向*/ /*orientation:landscape横向*/ /*iPhone 4*/ @media only screen and (min-devi ...

  7. iframe 自适应内容高度

    在使用iframe的时候,会出现iframe不能随着内容的高度自动改变的情况,下面就介绍一种可以自适应高度的办法.<br/> <pre> <iframe id=" ...

  8. POST和GET的详细解释以及区别

    Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP ...

  9. POPTEST 150801 祝大家前途似锦

    POPTEST 150801 祝大家前途似锦   PT20150801学员不断在就业,同学们走好,远兵辛苦了!!!

  10. (转)POPTEST联合创始人李爱然的“IT培训创业的随想"

    IT教育行业最大的问题是缺少像互联网行业一样的产品经理. 大多数IT教育机构在早期依靠个人或者一套课程开创了一定的局面,随着机构的壮大,机构把市场营销提到至高点,销售至上,而把产品(培训产品)放在后面 ...