返回总目录


本篇目录

介绍###

每个应用程序都需要存储一些设置信息,然后在应用程序中的某个地方使用这些设置。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. My year of 2016

    2016, year of excellence.   Year of happiness. In Beijing we can also find some happiness which is s ...

  2. Linux deepin 下sublimes配置g++ openGL

    参考 :http://blog.csdn.net/u010129448/article/details/47754623 ubuntu 下gnome只要将代码中deepin-terminal改为gno ...

  3. android_studio上传svn的时候那些不提交

    buid文件夹不需要提交

  4. Mongodb集群搭建的三种方式

    转自:http://blog.csdn.net/luonanqin/article/details/8497860 MongoDB是时下流行的NoSql数据库,它的存储方式是文档式存储,并不是Key- ...

  5. c# 如何中List<object>中去掉object对象中的重复列数据?

    //去掉重复 var title = modelList.GroupBy(m => m.Title.ToLower().Trim()).Select(m => new { ID = m.F ...

  6. 【oracle】数据泵expdp与impdp

    1.创建directory create directory dump_dir as 'D:\dump_dir' 2.expdp备份schema expdp system/1qaz2wsx@ETCNC ...

  7. Print a Binary Tree in Vertical Order

    http://www.geeksforgeeks.org/print-binary-tree-vertical-order/ package algorithms; import java.util. ...

  8. MD5加密的Java实现

    在各种应用系统中,如果需要设置账户,那么就会涉及到储存用户账户信息的问题,为了保证所储存账户信息的安全,通常会采用MD5加密的方式来,进行储存.首先,简单得介绍一下,什么是MD5加密. MD5的全称是 ...

  9. bzoj3674同上(好短)

    +强在 就过了 既没有启发式又没有路径压缩,连建树都用的是代码最短的写法(什么心态,每天追求代码短) 话说回来 可持久化的数组感觉只能出类似裸题的题目,,,,藏也藏不住啊 #include <c ...

  10. bzoj1266最短路+最小割

    本来写了spfa wa了 看到网上有人写Floyd过了 表示不开心 ̄へ ̄ 改成Floyd试试... 还是wa ヾ(。`Д´。)原来是建图错了(样例怎么过的) 结果T了 于是把Floyd改回spfa 还 ...