本节内容:
简介
每个应用必需存储一些设置,并在应用里的某处使用它。ABP 提供一个强大的基础来存储 / 获取应用、租户和用户级别的设置,服务端与客户端都可以。
一个设置是一对 name-value 字符串,通常存储在数据库(或其它源)。我们可以把不是字符串类的值,转换成字符串后存储。
关于 ISettingStore
为使用设置系统, 必须实现 ISettingStore 接口。虽然你能用自己的方式实现它,不过在 module-zero 项目里已经完全实现。如果不实现它,会从配置文件(web.config 或 app.config)中读取设置,但不能修改设置。同样,scope 不能工作。
定义设置
设置在用前需要先定义,ABP 设计成模块化。所以不同模块可以有不同设置。一个模块为定义它的设置,创建一个继承自 SettingProvider 的类,如下是设置供应器示例代码:
- public class MySettingProvider: SettingProvider {
- public override IEnumerable 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 类的构造器有一些参数:
在创建一个设置供应器后,我们应该为我们的模块,在预初始化方法里注册它。
- Configuration.Settings.Providers.Add < MySettingProvider > ();
设置供应器会自动被依赖注入所注册,所以一个设置供应器可以注入任何依赖(如一个仓储),以用途其它源建立设置定义。
setting scope(设置范围)
在 SettingScopes 枚举里,有三个设置范围(或级别):
SettingScopes 枚举有 Flags(标志)特性,所以我们可以用多个范围(级别)定义一个设置。
设置范围在默认情况下是有继承关系的(除非你设置了 isInherited 为 false)。例如,我们定义一个设置范围为 "Application | Tenant | user" 然后尝试获取设置的当前值:
默认值可能是 null 或 ""。建议为设置尽可能地提供默认值。
重写设置定义
context.Manager 可获取一个设置定义,并修改它的值,这种方式,可以操作的设置定义。
获取设置值
在定义一个设置后,我们可在服务端和客户端获取它的当前值。
服务端
ISettingManager 用来执行设置操作,我们可在应用的任何地方注入并使用它。ISettingManager 定义了许多获取一个设置的值的方法。
常用的方法是 GetSettingValue(或异常 GetSettingValueAsync),获取设置基于范围级别(Application,Tenant,User)的当前值(如前面所述),例如:
- //Getting a boolean value (async call)
- var value1 = await SettingManager.GetSettingValueAsync < bool > ("PassiveUsersCanNotLogin");
- //Getting a string value (sync call)
- var value2 = SettingManager.GetSettingValue("SmtpServerAddress");
GetSetrtingValue 有泛型和异常版本,如上所述。当然也有方法能获取一个指定租户或用户的设置值或所有值列表。
由于广泛地使用了 ISettingManager,一些特殊的基类(如 ApplicationService,DomainService 和 AppController)有一个 SettingManager 属性。如果你从这些类继承,就不再需要显式注入 ISettingManager。
客户端
如果你在定义一个设置时,把 IsVisibleToClicents 设为 true,那么你可以在客户端使用 Javascript 获取它的当前值。abp.setting 命名空间定义了所需的函数和对象,例如:
- var currentColor = abp.setting.get("SiteColorPreference");
同样还有 getInt 和 getBoolean 方法,你可以使用 abp.setting.values 对象获取所有值。注意:如果你在服务端修改一个设置,除非刷新页面、以某种方式重新载入设置和用手工代码更新,否则客户端不会知道这个修改。
修改设置
ISetingManager 定义了 ChangeSettingForApplicationAsync,ChangeSettingForTenantAsync 和 ChangeSettingForUserAsync(和同步版)方法,分别为一个应用,一个租户和一个用户修改设置。
关于缓存
设置管理的缓存在服务端设置,所以我们不应该直接用仓储或数据库更新查询来修改一个设置。
来源: http://www.cnblogs.com/kid1412/p/5988899.html