ABP系统设置
代码分析
在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系统设置的更多相关文章
- [Abp 源码分析]五、系统设置
0.简要介绍 Abp 本身有两种设置,一种就是 上一篇文章 所介绍的模块配置 Configuration,该配置主要用于一些复杂的数据类型设置,不仅仅是字符串,也有可能是一些 C# 运行时的一些变量. ...
- ABP(现代ASP.NET样板开发框架)系列之1、ABP总体介绍
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之1.ABP总体介绍 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...
- ABP(现代ASP.NET样板开发框架)系列之2、ABP入门教程
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之2.ABP入门教程 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...
- ABP总体介绍
ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点, ...
- ABP dynamic API
打开ABP的事例项目SimpleTaskSystem.WebSpaAngular 中LayoutView <!-- Dynamic scripts of ABP system (They are ...
- 基于DDD的.NET开发框架 - ABP初探
返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...
- 老周的ABP框架系列教程 -》 一、框架理论初步学习
老周的ABP框架系列教程 -- 一.框架理论初步学习 1. ABP框架的来源与作用简介 1.1 简介 1.1.1 ABP框架全称为"ASP.NET Boilerplate ...
- 基于DDD的现代ASP.NET开发框架--ABP系列之2、ABP入门教程
基于DDD的现代ASP.NET开发框架--ABP系列之2.ABP入门教程 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boi ...
- 点这里进入ABP系列文章总目录
基于DDD的现代ASP.NET开发框架--ABP系列之1.ABP总体介绍 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boi ...
随机推荐
- tyvj 1884 [NOIP2000T4]方格取数 || codevs 1043 dp
P1884 [NOIP2000T4]方格取数 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 [noip2000T4]方格取数 描述 设有N*N的方格图(N& ...
- 有若干个箱子,假设每个箱子的最大承重为 MaxW 。将货物分配装箱
今天在博客园中看到一个博问,就写了下实现代码. 问题: 有若干个箱子,假设每个箱子的最大承重为 MaxW .有一批物品,它们的重量分别为w1.w2...Wn,假设每个物品的重量都不超过箱子承重.写个算 ...
- nova instance启动中的同步与异步
instance create:nova/api/servers.create -- self.compute_api.create -- self.compute_task_api.build_in ...
- js 实现自动调出键盘
在app中,在页面加载完成之后,给输入框添加一个focus,不能自动调出软键盘,可以用以下方式实现: //触发键盘 $("#content").on("touchstar ...
- spring: 使用嵌入式数据源 EmbeddedDatabaseBuilder
嵌入式数据源作为应用的一部分运行,非常适合在开发和测试环境中使用,但是不适合用于生产环境.因为在使用嵌入式数据源的情况下,你可以在每次应用启动或者每次运行单元测试之前初始化测试数据. 使用Spring ...
- hdu 1220 容斥
http://acm.hdu.edu.cn/showproblem.php?pid=1220 Cube Time Limit: 2000/1000 MS (Java/Others) Memory ...
- s3cmd 安装使用指南
https://wangyan.org/blog/s3cmd-how-to-use.html s3cmd 安装使用指南 s3cmd 是一款 Amazon S3 命令行工具.它不仅能上传.下载.同步,还 ...
- KVM-克隆
kvm虚拟机的克隆分为两种情况,本文也就通过以下两种情况进行克隆,克隆虚拟机为Centos 6.4X64. (1) KVM主机本机虚拟机直接克隆. (2) 通过复制配置文件与磁盘文件的虚拟机复制克隆( ...
- js 对象可枚举属性以及for in 循环和for of 循环
js中每个对象的属性(js里万物皆属性,对象的属性也是对象)都有一个属性叫enumerable(可枚举性),这个属性true/false决定了该对象的属性是否可枚举(就是让一些方法访问到这个属性). ...
- uva11078 - Open Credit System(动态维护关键值)
这道题使用暴力解法O(n*n)会超时,那么用动态维护最大值可以优化到O(n).这种思想非常实用. #include<iostream> #include<cstdio> #in ...