介绍

每个应用程序都需要存储一些设置,并在应用程序的某个地方使用这些设置。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的更多相关文章

  1. ABP源码分析七:Setting 以及 Mail

    本文主要说明Setting的实现以及Mail这个功能模块如何使用Setting. 首先区分一下ABP中的Setting和Configuration. Setting一般用于需要通过外部配置文件(或数据 ...

  2. 设置ABP默认使用中文

    ABP提供的启动模板, 默认使用是英文: 虽然可以通过右上角的菜单切换成中文, 但是对于国内项目来说, 默认使用中文是很正常的需求. 本文介绍了如何实现默认语言的几种方法, 希望能对ABP爱好者有所帮 ...

  3. ABP源码分析四十一:ZERO的Audit,Setting,Background Job

    AuditLog: 继承自Entity<long>的实体类.封装AuditLog的信息. AuditingStore: 实现了IAuditingStore接口,实现了将AuditLog的信 ...

  4. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  5. ABP(现代ASP.NET样板开发框架)系列之9、ABP设置管理

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之9.ABP设置管理 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...

  6. 在ABP中创建Person实体类

    经过之前的准备目前我们的项目,终于可以搞正式的开发工作了. 创建实体Person 在Core类库中添加Person类 /// <summary> /// 联系人 /// </summ ...

  7. ABP源码分析九:后台工作任务

    文主要说明ABP中后台工作者模块(BackgroundWorker)的实现方式,和后台工作模块(BackgroundJob).ABP通过BackgroundWorkerManager来管理Backgr ...

  8. ABP源码分析二十:ApplicationService

    IApplicationService : 空接口,起标识作用.所有实现了IApplicationService 的类都会被自动注入到容器中.同时所有IApplicationService对象都会被注 ...

  9. ABP源码分析二十四:Notification

    NotificationDefinition: 用于封装Notification Definnition 的信息.注意和Notification 的区别,如果把Notification看成是具体的消息 ...

随机推荐

  1. JavaScript取出字符串和尾随空格

    书写JavaScript性能trim()之前和之后删除空字符串格,的功能的应用String物replace()方法去除空字符串端到端格.trim()例如,对于功能键下面的代码: <script ...

  2. [LeetCode] Subsets [31]

    题目 Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must ...

  3. delphi xe 之路(14)使用FireMonkeyStyle(一共30篇)

    FireMonkey使用Style来控制控件的显示方式. 每个控件都有一个StyleLookup属性,FireMonkey就是通过控件的这个属性来在当前窗体的StyleBook控件中查找匹配的Styl ...

  4. javascript自定义事件讲解

    自定义事件 什么是自定义事件? 自定义事件:这要是跟函数有关系,就是让函数能够具备事件的某些特性 为什么要使用自定义事件? 有利于多人协作开发代码,一同开发不冲突 如何去挂载自定义事件与事件函数? 1 ...

  5. 新浪微博API OAuth1 Python3客户端

    #!/usr/local/bin/python3 # coding=gbk # http://www.cnblogs.com/txw1958/ # import os, io, sys, re, ti ...

  6. LeetCode OJ平台Sort Colors讨论主题算法

    原题如下面,这意味着无序排列(由0,1,2组成).一号通.组织成若干阵列0-几个1-几个2这样的序列. Given an array with n objects colored red, white ...

  7. N+1:创新点的设计

    定义.公式.模型.算法的提出: 0. 如何进行抽象,如何定义数学表达式 二次衰减函数: f(z)=1z2 ⇒ f(z)=11+z2 噪声衰减因子: 对值域的要求,单调性的要求,必须是可调的: 2n1+ ...

  8. Win10 UWP版《芒果TV》v2.4.0直播超女,芒果台综艺一网打尽

    Win10 UWP版<芒果TV>直播超女,芒果台综艺一网打尽 Win10版UWP<芒果TV>自2015年9月登录商店以来,一直在持续更新,积极改进,拥有芒果台视频的独家点播和直 ...

  9. Java8 的一些新特性总结

    目前Java8已经发布很多个版本了,对于Java8中的新特性虽然有各位大神进行jdk8的英文特性文档翻译,但都太官方化语言,对照几篇翻译本人对新特性文档做一下总结,以帮助我和各位不了解Java8新特性 ...

  10. EasyUI之combogrid

    html代码: <div class="item-label">@Html.L("Name"):</div> <input id= ...