返回总目录


本篇目录

介绍###

每个应用程序都需要存储一些设置信息,然后在应用程序中的某个地方使用这些设置。ABP提供了健壮的基础设施来存储或检索服务端和客户端的应用程序,租户,用户级别的可用设置。

一个设置一般是存储在数据库(或其他源)的name-value字符串对。我们可以将非字符串的值转换成字符串。

关于ISettingStore

为了使用设置系统,必须要实现ISettingStore。虽然你可以用自己的方式实现,但是它已完全实现在module-zero中了。

定义设置###

一个设置使用前必须先定义。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值:设置的默认值。可以为null或空字符串。
  • Scopes:一个设置应该定义它的范围(看下面)。
  • Dispaly name:在UI上显示的本地化的设置名。
  • Description:在UI上显示的本地化的设置描述。
  • Group:用于组合设置。这个用于UI而不是设置管理。
  • IsVisibleToClients:客户端是否可见。

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

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

这样,设置提供器就自动注册到依赖注入系统中了。因此,设置提供器可以使用一些其他的资源注入任何依赖(如仓储)来生成设置定义。

设置范围

SettingScope枚举类中定义了三种设置范围(或者说等级)

  • Application:一个应用范围的setting对象用于用户或者租户独立的设置。比如,我们可以定义一个叫做“SmtpServerAddress”的设置来获取发送邮件时服务端的IP地址。如果该setting有一个单一值(基于用户不会改变),那么我们可以把它定义为应用范围的。
  • Tenant:如果应用程序时多租户的,那么我们可以定义租户特定的setting。
  • User:我们可以定义存储或者获取特定用户的设置。

SettingScopes枚举类型有Flags特性,因此我们可以定义一个不止一个范围的setting。

设置范围是有层次的,比如,如果我们定义的设置范围是“Application | Tenant | User”,并尝试获取该设置当前的值,那么:

  • 如果已定义了该用户的setting,那么就会获得该用户特定的值。
  • 如果上面的条件不成立,并且已经定义了该用户所属租户的setting,那么会获得该租户特定的值。
  • 如果上面的条件还不成立,如果定义了应用的值,那么会获得该应用的值。
  • 最后,我们会获得默认值

默认值可能是null或者空字符串。如果可能的话,建议为setting的默认值提供默认值。

获取设置值###

定义了一个setting之后,我们就可以在客户端和服务端获得它当前的值。

服务端

ISettingManager用于执行setting操作。我们可以在应用中的任何地方注入并使用它。ISettingManager定义了许多获取一个setting值的方法。

用的最多的方法是GetSettingValue(或者异步调用GetSettingValueAsync)。它会返回基于默认值,应用程序,租户和用户setting的当前的值(正如上面提到的)。例如:

//获取一个bool值(异步调用)
var value1 = await SettingManager.GetSettingValueAsync<bool>("PassiveUsersCanNotLogin"); //获取一个string值(同步调用)
var value2 = SettingManager.GetSettingValue("SmtpServerAddress");

GetSettingValue有泛型和异步版本,如上面所示。也有获得特定租户或者用户的setting值或者所有setting值的列表的方法。

因为ISettingManager使用广泛,所以一些特殊的基类(如ApplicationService,DomainService和AbpController)就有了一个叫做SettingManager的属性。如果我们从这些类中派生,那么就不需要显式注入它了。

客户端

当定义一个setting时,如果将IsVisibleToClients设置为true,那么可以使用javascript在客户端获得当前的值。abp.setting命名空间定义了一些用得到的函数和对象。例如:

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

也有getIntgetBoolean 方法。你可以使用abp.setting.values获得所有的值。注意:如果在服务端更改了一个setting,那么如果页面没有更新,setting没有重新加载或者通过代码手动更新的话,那么客户端就不知道该setting是否发生了变化。

更改设置###

ISettingManager为应用程序,租户和用户分别定义了ChangeSettingForApplicationAsync, ChangeSettingForTenantAsync和ChangeSettingForUserAsync方法来更改setting。

关于缓存###

Setting Manager(管理者)缓存到了服务端的setting了。因此,我们不应该使用仓储或者数据库更新来直接更改一个setting的值。

ABP理论学习之设置管理的更多相关文章

  1. X-Admin&ABP框架开发-设置管理

    在网站开发中,设置是不可缺少的一环,如用户设置.系统设置.甚至是租户设置等.ABP对于设置的管理已经做了很好的处理,我们可以借助巨人的力量来完成我们的冒险. ABP官网地址:https://aspne ...

  2. ABP理论学习之功能管理

    返回总目录 本篇目录 介绍 功能类型 定义功能 检查功能 功能管理者 版本说明 介绍 大多数的Saas(多租户)应用都有不同 功能的 版本(包).因此,他们可以给租户(客户)提供不同的 价格和功能选项 ...

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

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

  4. ABP框架 - 设置管理

    文档目录 本节内容: 简介 关于ISettingStore 定义设置 setting scope(设置范围) 重写设置定义 获取设置值 服务端 客户端 修改设置 关于缓存 简介 每个应用必需存储一些设 ...

  5. ABP官方文档翻译 2.5 设置管理

    设置管理 介绍 关于 ISettingStore 定义设置 设置范围 重写设置定义 获取设置值 服务端 客户端 更改设置 关于缓存 介绍 每个应用都需要存储设置,并且在应用的某些地方需要使用这些设置. ...

  6. 初识ABP vNext(10):ABP设置管理

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 定义设置 使用设置 最后 前言 上一篇介绍了ABP模块化开发的基本步骤,完成了一个简单的文件上传功能.通常的模块都有一 ...

  7. ABP设置管理模块: Abp.SettingUi

    开源地址: https://github.com/EasyAbp/Abp.SettingUi 一直想宣传一下SettingUi, 因为 懒 工作比较忙, 所以才拖到今天. 关于ABP就不需要我再多废口 ...

  8. ABP理论学习之开篇介绍

    返回总目录 为了和2016年春节赛跑,完成该系列博客,我牺牲了今天中午的时间来完成该系列的第一篇----开篇介绍.开篇介绍嘛,读过大学教材的同学都知道,这玩意总是那么无聊,跟考试没关系,干脆直接跳过, ...

  9. ABP理论学习之数据过滤器

    返回总目录 本篇目录 介绍 预定义过滤器 关闭过滤器 开启过滤器 设置过滤器参数 定义自定义过滤器 其他ORM 介绍 软删除模式通常用于不会真正从数据库删除一个实体而是仅仅将它标记为"已删除 ...

随机推荐

  1. *** wechat-php-sdk 微信公众平台php开发包

    wechat-php-sdk 微信公众平台php开发包,细化各项接口操作,支持链式调用,欢迎Fork此项目weixin developer SDK. 项目地址:https://github.com/d ...

  2. Eclipse下配置javaweb项目快速部署到tomcat

    用惯了VS,再用Eclipse,完全有一种从自动挡到手动挡的感觉啊. 很多同学在Eclipse下开发web项目,每一次修改代码,看效果的时候都有右键项目->Run as -> Run on ...

  3. 【Cocos2d-x for WP8 学习整理】(5)文字显示全整理

    学习 Cocos2d-x 有一阵了,现在要做个小东西,第一步就遇到了文字展示的问题,于是想把可能遇到的问题统统整理一下.这一部分也不局限于wp8,全平台应该都是一个解决方案. 先在脑袋里大致想了一下, ...

  4. 7 Container With Most Water_Leetcode

    Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). ...

  5. LD算法获取字符串相似度

    一个如何识别相似语句的问题,于是上网找了找,一个叫Levenshtein Distance的算法比较简单,就写了段代码实现了一下,效果还不错. 这个算法是一个俄国人Lvenshtein提出的,用于计算 ...

  6. T-SQL 基本语法

    --查询 select DB_ID('B2C') --检查数据库是否存在 if DB_ID('B2C') is not null --使用数据库 use B2C --单引号表示字符串,双引号则不是 U ...

  7. React News Site 新闻站

    Learn React & Webpack by building the Hacker News front page from https://github.com/theJian/bui ...

  8. 如何用Qt做SolidWorks二次开发

    这个问题困扰了我2年了,之前找到的教程都是MFC的,ATL导入向导或是通过导入类型库的方式来调用控件,我一直都搞不明白. 最近学习了ActiveQT以及通过ActiveQT控制EXCEL.Word.P ...

  9. 读取hdfs文件之后repartition 避免数据倾斜

    场景一: api:  textFile("hfds://....").map((key,value)).reduceByKey(...).map(实际的业务计算逻辑) 场景:hdf ...

  10. python实现简单爬虫功能

    在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材. 我们最常规的做法就是通过鼠标右键,选择另存为.但有些图片鼠标右键的 ...