本文主要说明Setting的实现以及Mail这个功能模块如何使用Setting.

首先区分一下ABP中的Setting和Configuration。

Setting一般用于需要通过外部配置文件(或数据库)设置的简单类型数据(一般就是字符串),比如SMTP HOST.

Configuration一般只需要通过内部代码完成的配置,一般用于设置复杂类型的数据。

目前Abp在setting 这个功能模块只能从配置文件读取设置,无法从其他source(比如数据库)读取设置。也可以自定义SettingStore然后注入到ABP中来实现从其他Source读取设置(非本文重点)。

Setting如何实现的:

首先我们要定义一个Setting,也就是说我们需要设置什么? 这个就是SettingDefinition。,

SettingDefinition/SettingDefinitionGroup, 用于定义Setting。不同的Name标识不同的Setting。假如要配置SMTP HOST,那么就可以定义一个name="Abp.Net.Mail.Smtp.Host" 的SettingDefinition。注意: Name和DefaultValue必须要的属性,其他都是辅助属性。SettingDefinitionGroup用于给SettingDefinition分组,Abp底层框架似乎没有真正使用过这个类。

下面这个图说明SettingDefinition/SettingDefinitionGroup定义了哪些属性及他们的关系。

SettingScopes:这是一个标注了Flags特性的枚举类型,表示setting的应用范围。

SettingDefinitionProviderContext:上下文类,一般用于封装方法间调用需要传递的参数。目前来说只是个空类,没有实际作用。

SettingProvider: 为具体的功能模块所需的设置定义SettingDefinition,并且以数组的形式返回。使用SettingProvider定义SettingDefinition的是准确方式。 那么Setting定义好以后,如何为其设置实际需要的value呢?目前可以在从web.config中设置。目前有EmailSettingProvider用于提供SMTP的设置,NotificationSettingProvider,LocalizationSettingProvider,还有ClearCacheSettingProvider。

SettingsConfiguration /ISettingsConfiguration:用于集中化设置和管理SettingProvider的对象。其封装了一个ITypeList<SettingProvider> Providers的集合类。实际项目中可以通过Configuration.Setting来获取ISettingsConfiguration实例,然后将自定义的SettingProvider添加到SettingsConfiguration 对象中(需要在模块的PreInitialize方法完成这个动作)。

ISettingDefinitionManager/SettingDefinitionManager: 主要完成注册到ABP中的SettingDefinition初始化。 首先通过ISettingsConfiguration实例获取setting providers集合,然后在Initialize方法中通过setting providers获取SettingDefinition的数组。并将其保存在Dictionary中,其key就是SettingDefinition的name.

ISettingDefinitionManager的Initialize方法是在AbpKernelModule的PostInitialize方法执行的时候被调用。

上面接口/类直接的关系图


上面解释了ABP是如何定义/管理一个Setting. 下面解释下ABP是如何使用Setting的。

ISettingValue/SettingValueObject:代表setting的键值对。Setting的具体值当然在外部Config中,然而在代码中是通过ISettingValue来封装的。

SettingManager:通过ISettingStore获取或更改Setting的值,SettingManager并不是每次调用ISettingStore去读取设置,而是在第一读取的时候就将结果缓存起来。如下代码所示

定义缓存对象

读入缓存

SettingInfo:封装了应用于user/tenant的setting值

ISettingStore:这个接口定义了相关方法用于从数据源读取和更改setting值。 这些方法以SettingInfo类型作为方法的输入和输出参数。

DefaultConfigSettingStore:ABP中唯一实现了ISettingStore的类,只用于从配置文件读取setting,修改是不支持的。ABP.Zero中有另外一个支持CRUD的实现。

下图是上面接口及类的关系图


下面以Mail功能的实现来说明如何使用Setting

EmailSettingNames/Smtp: 封装SMTP设置的信息。也就是说定义了一些常量用作setting的name. 比如Host就是“Abp.Net.Mail.Smtp.Host”,所以在web.config就要配置一项key是“Abp.Net.Mail.Smtp.Host”的配置项。

EmailSettingProvider:继承自SettingProvider, 将SMTP的各项设置封装成SettingDefinition,并以数组形式返回。

ISmtpEmailSenderConfiguration/IEmailSenderConfiguration:定义了获取EmailSettingNames中定义的设置的接口。

EmailSenderConfiguration/SmtpEmailSenderConfiguration: 实现上面两个接口,通过IsettingManager的实例读取设置

IEmailSender/ISmtpEmailSender/EmailSenderBase/SmtpEmailSender: 用于发送邮件。

最后,照旧图示他们之间的关系。

返回ABP源码分析系列文章目录

ABP源码分析七:Setting 以及 Mail的更多相关文章

  1. [Abp 源码分析]七、仓储与 Entity Framework Core

    0.简介 Abp 框架在其内部实现了仓储模式,并且支持 EF Core 与 Dapper 来进行数据库连接与管理,你可以很方便地通过注入通用仓储来操作你的数据,而不需要你自己来为每一个实体定义单独的仓 ...

  2. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  3. ABP源码分析四十一:ZERO的Audit,Setting,Background Job

    AuditLog: 继承自Entity<long>的实体类.封装AuditLog的信息. AuditingStore: 实现了IAuditingStore接口,实现了将AuditLog的信 ...

  4. ABP源码分析九:后台工作任务

    文主要说明ABP中后台工作者模块(BackgroundWorker)的实现方式,和后台工作模块(BackgroundJob).ABP通过BackgroundWorkerManager来管理Backgr ...

  5. ABP源码分析二十:ApplicationService

    IApplicationService : 空接口,起标识作用.所有实现了IApplicationService 的类都会被自动注入到容器中.同时所有IApplicationService对象都会被注 ...

  6. ABP源码分析二十四:Notification

    NotificationDefinition: 用于封装Notification Definnition 的信息.注意和Notification 的区别,如果把Notification看成是具体的消息 ...

  7. ABP源码分析三十三:ABP.Web

    ABP.Web模块并不复杂,主要完成ABP系统的初始化和一些基础功能的实现. AbpWebApplication : 继承自ASP.Net的HttpApplication类,主要完成下面三件事一,在A ...

  8. ABP源码分析三十四:ABP.Web.Mvc

    ABP.Web.Mvc模块主要完成两个任务: 第一,通过自定义的AbpController抽象基类封装ABP核心模块中的功能,以便利的方式提供给我们创建controller使用. 第二,一些常见的基础 ...

  9. ABP源码分析三十六:ABP.Web.Api

    这里的内容和ABP 动态webapi没有关系.除了动态webapi,ABP必然是支持使用传统的webApi.ABP.Web.Api模块中实现了一些同意的基础功能,以方便我们创建和使用asp.net w ...

随机推荐

  1. ABP入门系列(2)——通过模板创建MAP版本项目

    一.从官网创建模板项目 进入官网下载模板项目 依次按下图选择: 输入验证码开始下载 下载提示: 二.启动项目 使用VS2015打开项目,还原Nuget包: 设置以Web结尾的项目,设置为启动项目: 打 ...

  2. .NetCore中的日志(1)日志组件解析

    .NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...

  3. [C#] 软硬结合第二篇——酷我音乐盒的逆天玩法

    1.灵感来源: LZ是纯宅男,一天从早上8:00起一直要呆在电脑旁到晚上12:00左右吧~平时也没人来闲聊几句,刷空间暑假也没啥动态,听音乐吧...~有些确实不好听,于是就不得不打断手头的工作去点击下 ...

  4. DDD初学指南

    去年就打算总结一下,结果新换的工作特别忙,就迟迟没有认真动手.主要内容是很多初学DDD甚至于学习很长时间的同学没有弄明白DDD是什么,适合什么情况.这世界上没有银弹,抛开了适合的场景孤立的去研究DDD ...

  5. 【Web动画】SVG 线条动画入门

    通常我们说的 Web 动画,包含了三大类. CSS3 动画 javascript 动画(canvas) html 动画(SVG) 个人认为 3 种动画各有优劣,实际应用中根据掌握情况作出取舍,本文讨论 ...

  6. [WPF] Wait for a moment.

    一.控件介绍 在 WPF 中使用的等待控件,控件包括三种,普通的等待信息提示(WaitTip),进度条提示(WaitProgress),以及主程序覆盖的模拟时钟等待窗口(WaitClock),具体效果 ...

  7. 使用Expression实现数据的任意字段过滤(1)

    在项目常常要和数据表格打交道. 现在BS的通常做法都是前端用一个js的Grid控件, 然后通过ajax的方式从后台加载数据, 然后将数据和Grid绑定. 数据往往不是一页可以显示完的, 所以要加分页: ...

  8. 编写一个通用的Makefile文件

    1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe ...

  9. [Django]用户权限学习系列之User权限基本操作指令

    针对Django 后台自带的用户管理系统,虽说感觉还可以,但是为了方便用户一些操作,特别设计自定义的用户权限管理系统. 在制作权限页面前,首先需要了解权限和用户配置权限的指令,上章讲到权限的添加,删除 ...

  10. slf4j

    Simple Logging Facade for Java (SLF4J) slf4j可以看成是对各个日志框架的一种抽象,它提供了一套通用的日志使用接口. 下面是slf4j的几个版本比较: 1.6. ...