代码分析

在abp中添加系统设置,都是在模块的预初始化方法中添加的.

  1. Configuration.Settings.Providers.Add<EmailSettingProvider>();

Configuration之前已经说过了,这是AbpModule里的属性,IAbpStartupConfiguration 这个类就是负责abp启动时的配置,以及模块的配置。之前说的模块配置是通过IAbpStartupConfiguration里的ModuleConfigurations Modules配置的.

  1. public interface IAbpStartupConfiguration : IDictionaryBasedConfig
  2. {
  3. // 其他代码略
  4. IModuleConfigurations Modules { get; }
  5. ISettingsConfiguration Settings { get; }
  6. // 略。
  7. }

初始化的话,之前也说过了,是在AbpBootstrapper中,通过ioc容器取得AbpStartupConfiguration。然后执行初始化方法.在初始化方法中通过ioc容器取得每个属性的对应实例,赋值。也就是说 Settings就是这时候被初始化的

ISettingsConfiguration

  1. public interface ISettingsConfiguration
  2. {
  3. /// <summary>
  4. /// List of settings providers.
  5. /// </summary>
  6. ITypeList<SettingProvider> Providers { get; }
  7. }
  8. internal class SettingsConfiguration : ISettingsConfiguration
  9. {
  10. public ITypeList<SettingProvider> Providers { get; private set; }
  11. public SettingsConfiguration()
  12. {
  13. Providers = new TypeList<SettingProvider>();
  14. }
  15. }

通过看到详细代码,这个就很明显了,这里维护了一个 SettingProvider 集合

开头可以看到就是通过这个集合添加我们自定义设置的,这里集合的类型是一个SettingProvider

也就是说我们自定义的设置,必须继承自SettringProvider才可以被添加

  1. /// Inherit this class to define settings for a module/application.
  2. /// </summary>
  3. public abstract class SettingProvider : ITransientDependency
  4. {
  5. /// <summary>
  6. /// Gets all setting definitions provided by this provider.
  7. /// </summary>
  8. /// <returns>List of settings</returns>
  9. public abstract IEnumerable<SettingDefinition> GetSettingDefinitions(SettingDefinitionProviderContext context);
  10. }

这是一个抽象类也就是说我们自定义的settingprovier必须实现GetSettingDefinitions方法咯.

例如,清除缓存的设置

  1. public class ClearCacheSettingProvider : SettingProvider
  2. {
  3. public override IEnumerable<SettingDefinition> GetSettingDefinitions(SettingDefinitionProviderContext context)
  4. {
  5. return new[]
  6. {
  7. new SettingDefinition(ClearCacheSettingNames.Password, "123qweasdZXC")
  8. };
  9. }
  10. }

那么SettingDefinition是什么呢

看名字是设置的定义的意思,设置用于配置和更改应用程序的行为 里面有Name,DisplayName Scopes等属性.

那么我们定义好了SettingProvider,在模块与初始化方法中加入到我们的Providers集合之后.又做了什么呢.

SettingDefinitionManager

如果你熟悉ABP的话,你就会知道,我们把一个配置存入了集合中,那肯定也要是可以取出来的

我们在写代码的时候,都是通过SettingManager来获取配置的.

  1. //Getting a boolean value (async call)
  2. var value1 = await SettingManager.GetSettingValueAsync<bool>("PassiveUsersCanNotLogin");
  1. public class SettingManager : ISettingManager, ISingletonDependency
  2. {
  3. // 其他代码 略.
  4. private readonly ISettingDefinitionManager _settingDefinitionManager;
  5. }

SettingManager中有个ISettingDefinitionManager,其实 GetSettingValue方法最终调用的是settingDefinitionManager的GetSettingDefinition方法

  1. private async Task<string> GetSettingValueInternalAsync(string name, int? tenantId = null, long? userId = null, bool fallbackToDefault = true)
  2. {
  3. var settingDefinition = _settingDefinitionManager.GetSettingDefinition(name);
  4. }

接下来看看SettingDefinitionManager

  1. internal class SettingDefinitionManager : ISettingDefinitionManager, ISingletonDependency
  2. {
  3. private readonly IIocManager _iocManager;
  4. private readonly ISettingsConfiguration _settingsConfiguration;
  5. private readonly IDictionary<string, SettingDefinition> _settings;
  6. /// <summary>
  7. /// Constructor.
  8. /// </summary>
  9. public SettingDefinitionManager(IIocManager iocManager, ISettingsConfiguration settingsConfiguration)
  10. {
  11. _iocManager = iocManager;
  12. _settingsConfiguration = settingsConfiguration;
  13. _settings = new Dictionary<string, SettingDefinition>();
  14. }
  15. public void Initialize()
  16. {
  17. var context = new SettingDefinitionProviderContext(this);
  18. foreach (var providerType in _settingsConfiguration.Providers)
  19. {
  20. using (var provider = CreateProvider(providerType))
  21. {
  22. foreach (var settings in provider.Object.GetSettingDefinitions(context))
  23. {
  24. _settings[settings.Name] = settings;
  25. }
  26. }
  27. }
  28. }
  29. public SettingDefinition GetSettingDefinition(string name)
  30. {
  31. if (!_settings.TryGetValue(name, out var settingDefinition))
  32. {
  33. throw new AbpException("There is no setting defined with name: " + name);
  34. }
  35. return settingDefinition;
  36. }
  37. }

可以看到这里维护了一个 字典,key是string,value是SettingDefinition,那么是什么时候加入到字典中的呢?

可以看到在initialize方法中遍历我们SettingConfiguration的Providers属性,然后从IOC容器中取出,追加进字典集合中。那么想知道是什么时候执行的,只需要看看Initialize方法的调用就知道了。

嗯,只有一个调用。就是在AbpKernelModule中 初始化完成方法中 执行的

  1. public sealed class AbpKernelModule
  2. {
  3. public override void PostInitialize()
  4. {
  5. // 其他代码.. 略
  6. IocManager.Resolve<SettingDefinitionManager>().Initialize();
  7. // 略。
  8. }
  9. }

ABP系统设置的更多相关文章

  1. [Abp 源码分析]五、系统设置

    0.简要介绍 Abp 本身有两种设置,一种就是 上一篇文章 所介绍的模块配置 Configuration,该配置主要用于一些复杂的数据类型设置,不仅仅是字符串,也有可能是一些 C# 运行时的一些变量. ...

  2. ABP(现代ASP.NET样板开发框架)系列之1、ABP总体介绍

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

  3. ABP(现代ASP.NET样板开发框架)系列之2、ABP入门教程

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

  4. ABP总体介绍

    ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点, ...

  5. ABP dynamic API

    打开ABP的事例项目SimpleTaskSystem.WebSpaAngular 中LayoutView <!-- Dynamic scripts of ABP system (They are ...

  6. 基于DDD的.NET开发框架 - ABP初探

    返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

  7. 老周的ABP框架系列教程 -》 一、框架理论初步学习

    老周的ABP框架系列教程 -- 一.框架理论初步学习   1. ABP框架的来源与作用简介 1.1  简介 1.1.1       ABP框架全称为"ASP.NET Boilerplate ...

  8. 基于DDD的现代ASP.NET开发框架--ABP系列之2、ABP入门教程

    基于DDD的现代ASP.NET开发框架--ABP系列之2.ABP入门教程 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boi ...

  9. 点这里进入ABP系列文章总目录

    基于DDD的现代ASP.NET开发框架--ABP系列之1.ABP总体介绍 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boi ...

随机推荐

  1. 关于es集群转换为单点后,主分片丢失的问题(健康检测状态为red)

    正在找解决方案 前后情况是, 之前是es双节点,之后更改为单节点,data中的数据都是双节点的,也许导致了单节点的状态不正常,删除了data目录下内容后,重启es,好了,这是测试环境,所以这么干的

  2. JavaWeb -- 内省—beanutils工具包 的使用

    Apache组织开发了一套用于操作JavaBean的API,这套API考虑到了很多实际开发中的应用场景,因此在实际开发中很多程序员使用这套API操作JavaBean,以简化程序代码的编写. Beanu ...

  3. 获得一个list中某元素的索引值

    list = [1,2,3,3,2,1] list.index(1) # 只能获得首个1的索引值 如果要获得所有该元素的索引值 import numpy as np arr = np.array(li ...

  4. Oracle通过PLSQL进行数据表之间的同步

    昨天被要求拉取第三方oracle中的一个表数据,起初以为要导出表数据,然后再自己库中建个相同的表,然后导入数据,查过资料之后oracle可以通过dblink的方式同步表数据. 1.首先利用PLSQL工 ...

  5. PHP 图片操作(按照指定尺寸压缩,按照比例裁剪)

    提供二个常用的图片处理方法: 1.按照指定的尺寸压缩图片 /** * 按照指定的尺寸压缩图片 * @param $source_path 原图路径 * @param $target_path 保存路径 ...

  6. jedis提纲

    A01 - jedis库介绍 A01 - 在多线程下使用Jedis A01 - Jedis的八种调用方式   A02 - API使用文档 A02 - Jedis代码编程使用(简单的使用)   A03 ...

  7. Codeforces 610D Vika and Segments 线段树+离散化+扫描线

    可以转变成上一题(hdu1542)的形式,把每条线段变成宽为1的矩形,求矩形面积并 要注意的就是转化为右下角的点需要x+1,y-1,画一条线就能看出来了 #include<bits/stdc++ ...

  8. Adobe 产品更新直接下载链接

    mac:http://prodesigntools.com/adobe-cc-2015-updates-links-mac.html win:http://prodesigntools.com/ado ...

  9. Windows7 如何关闭系统更新

    我们点击开始菜单,找到控制面板这个选项,如图:  然后进入操作中心,如图:  然后选择如图所示的选项,如图:  然后选择更改设置选项,如图:  然后我们选择从不检查更新并点击确定按钮,如图:

  10. 51nod 1625 贪心/思维

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1625 1625 夹克爷发红包 基准时间限制:1 秒 空间限制:13107 ...