代码分析

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

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

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

public interface IAbpStartupConfiguration : IDictionaryBasedConfig
{
// 其他代码略
IModuleConfigurations Modules { get; }
ISettingsConfiguration Settings { get; }
// 略。
}

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

ISettingsConfiguration

public interface ISettingsConfiguration
{
/// <summary>
/// List of settings providers.
/// </summary>
ITypeList<SettingProvider> Providers { get; }
} internal class SettingsConfiguration : ISettingsConfiguration
{
public ITypeList<SettingProvider> Providers { get; private set; } public SettingsConfiguration()
{
Providers = new TypeList<SettingProvider>();
}
}

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

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

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

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

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

例如,清除缓存的设置

public class ClearCacheSettingProvider : SettingProvider
{
public override IEnumerable<SettingDefinition> GetSettingDefinitions(SettingDefinitionProviderContext context)
{
return new[]
{
new SettingDefinition(ClearCacheSettingNames.Password, "123qweasdZXC")
};
}
}

那么SettingDefinition是什么呢

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

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

SettingDefinitionManager

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

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

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

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

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

接下来看看SettingDefinitionManager

internal class SettingDefinitionManager : ISettingDefinitionManager, ISingletonDependency
{
private readonly IIocManager _iocManager;
private readonly ISettingsConfiguration _settingsConfiguration;
private readonly IDictionary<string, SettingDefinition> _settings; /// <summary>
/// Constructor.
/// </summary>
public SettingDefinitionManager(IIocManager iocManager, ISettingsConfiguration settingsConfiguration)
{
_iocManager = iocManager;
_settingsConfiguration = settingsConfiguration;
_settings = new Dictionary<string, SettingDefinition>();
} public void Initialize()
{
var context = new SettingDefinitionProviderContext(this); foreach (var providerType in _settingsConfiguration.Providers)
{
using (var provider = CreateProvider(providerType))
{
foreach (var settings in provider.Object.GetSettingDefinitions(context))
{
_settings[settings.Name] = settings;
}
}
}
} public SettingDefinition GetSettingDefinition(string name)
{
if (!_settings.TryGetValue(name, out var settingDefinition))
{
throw new AbpException("There is no setting defined with name: " + name);
} return settingDefinition;
}
}

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

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

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

public sealed class AbpKernelModule
{
public override void PostInitialize()
{
// 其他代码.. 略
IocManager.Resolve<SettingDefinitionManager>().Initialize();
// 略。
}
}

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. YII2笔记之三

    activeform布局findAll等不能满足where, order by, limit,底层调用了findByConditioncol-md col-lg的使用 view的方法,前三个常用ren ...

  2. tp5 数据库Db增删改操作

    添加数据insert $data = [ 'name_cn' => '张三', 'name_en' => 'jack', ]; $res = Db::name('style')->i ...

  3. pandas 读取excel的指定列

    不管对于read_csv还是read_excel,现在都有: usecols : int or list, default None If None then parse all columns, I ...

  4. python快速学习-常用內建模块

  5. 判断一个浏览器是否支持opacity

    支持opacity的浏览器,总会将opacity值规范成小于1.0且以0开头的值.例如,如果将opacity指定为:.5,原始支持opacity的浏览器就会将该值规范为0.5,而不支持opacity的 ...

  6. review01

    .java叫源文件,java编译器编译源文件后会产生字节码文件,java解释器将字节码文件加载进内存,java虚拟机来执行字节码文件. 如下列文件名为“String01.java” public cl ...

  7. php攻击漏洞总结

    1.两字节编码(gbk)都存在宽字节攻击问题[character_set_client=gbk] 案例:http://www.cnblogs.com/lcamry/articles/5625276.h ...

  8. ES6-Set和Map数据结构学习笔记

    Set和Map数据结构 Set 基本用法 ES6提供了新的数据结构--Set,类似于数组,但是成员的值是唯一的,没有重复的值,Set本身是一种构造函数,用来生成Set数据结构 var s = new ...

  9. lightoj1422 区间dp

    对于这一题想了很久真的是一点头绪也没有,还有组数明明是200,数据范围100,O(n^3)的复杂度居然不会爆掉(可能是因为一直在想怎么用O(n^2)的复杂度做这题 做法是先预处理dp,对于dp[i][ ...

  10. LINUX CENTOS关机与重启命令详解

    Linux centos重启命令: 1.reboot 2.shutdown -r now 立刻重启(root用户使用) 3.shutdown -r 10 过10分钟自动重启(root用户使用) 4.s ...