ABP源码分析七:Setting 以及 Mail
本文主要说明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源码分析七:Setting 以及 Mail的更多相关文章
- [Abp 源码分析]七、仓储与 Entity Framework Core
0.简介 Abp 框架在其内部实现了仓储模式,并且支持 EF Core 与 Dapper 来进行数据库连接与管理,你可以很方便地通过注入通用仓储来操作你的数据,而不需要你自己来为每一个实体定义单独的仓 ...
- ABP源码分析一:整体项目结构及目录
ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...
- ABP源码分析四十一:ZERO的Audit,Setting,Background Job
AuditLog: 继承自Entity<long>的实体类.封装AuditLog的信息. AuditingStore: 实现了IAuditingStore接口,实现了将AuditLog的信 ...
- ABP源码分析九:后台工作任务
文主要说明ABP中后台工作者模块(BackgroundWorker)的实现方式,和后台工作模块(BackgroundJob).ABP通过BackgroundWorkerManager来管理Backgr ...
- ABP源码分析二十:ApplicationService
IApplicationService : 空接口,起标识作用.所有实现了IApplicationService 的类都会被自动注入到容器中.同时所有IApplicationService对象都会被注 ...
- ABP源码分析二十四:Notification
NotificationDefinition: 用于封装Notification Definnition 的信息.注意和Notification 的区别,如果把Notification看成是具体的消息 ...
- ABP源码分析三十三:ABP.Web
ABP.Web模块并不复杂,主要完成ABP系统的初始化和一些基础功能的实现. AbpWebApplication : 继承自ASP.Net的HttpApplication类,主要完成下面三件事一,在A ...
- ABP源码分析三十四:ABP.Web.Mvc
ABP.Web.Mvc模块主要完成两个任务: 第一,通过自定义的AbpController抽象基类封装ABP核心模块中的功能,以便利的方式提供给我们创建controller使用. 第二,一些常见的基础 ...
- ABP源码分析三十六:ABP.Web.Api
这里的内容和ABP 动态webapi没有关系.除了动态webapi,ABP必然是支持使用传统的webApi.ABP.Web.Api模块中实现了一些同意的基础功能,以方便我们创建和使用asp.net w ...
随机推荐
- 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目
最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目 最近一个来自重庆的客户找到走起君,客户的业务是做移动互联网支付,是微信支付收单渠道合作伙伴,数据库里存储的是支付流水和交易流水 ...
- C语言 · 乘法表
问题描述 输出九九乘法表. 输出格式 输出格式见下面的样例.乘号用"*"表示. 样例输出 下面给出输出的前几行:1*1=12*1=2 2*2=43*1=3 3*2=6 3*3=94 ...
- 移动端IOS点击事件失效解决方案
解决方案 解决办法有 4 种可供选择: 1 将 click 事件直接绑定到目标元素(即 .target)上 2 将目标元素换成 <a> 或者 button 等可点击的元素 3 将 clic ...
- CSS——关于z-index及层叠上下文(stacking context)
以下内容根据CSS规范翻译. z-index 'z-index'Value: auto | <integer> | inheritInitial: autoApplies to: posi ...
- C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent
看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...
- ComponentPattern (组合模式)
import java.util.LinkedList; /** * 组合模式 * * @author TMAC-J 主要用于树状结构,用于部分和整体区别无区别的场景 想象一下,假设有一批连锁的理发店 ...
- Android使用静默安装时碰见的问题
升级时碰见的异常 private void installPackage(String appName,final File apk) { if (!apk.exists()) { setHasNew ...
- 按照Enterprise Integration Pattern搭建服务系统
在前一篇文章中,我们已经对Enterprise Integration Pattern中所包含的各个组成进行了简单地介绍.限于篇幅(20页Word以内),我并没有深入地讨论各个组成.但是如果要真正地按 ...
- 最新Angular2案例rebirth开源
在过去的几年时间里,Angular1.x显然是非常成功的.但由于最初的架构设计和Web标准的快速发展,逐渐的显现出它的滞后和不适应.这些问题包括性能瓶颈.滞后于极速发展的Web标准.移动化多平台应用, ...
- 你还可以再诡异点吗——SQL日志文件不断增长
前言 今天算是遇到了一个罕见的案例. SQL日志文件不断增长的各种实例不用多说,园子里有很多牛人有过介绍,如果我再阐述这些陈谷子芝麻,想必已会被无数次吐槽. 但这次我碰到的问题确实比较诡异,其解决方式 ...