欢迎光临
我们一直在努力

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。注意: NameDefaultValue必须要的属性,其他都是辅助属性。SettingDefinitionGroup用于给SettingDefinition分组,Abp底层框架似乎没有真正使用过这个类。

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

 

ABP源码分析七:Setting以及Mail

 

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

ABP源码分析七:Setting以及Mail

 

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方法完成这个动作)。

ABP源码分析七:Setting以及Mail

 

ABP源码分析七:Setting以及Mail

 

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

ABP源码分析七:Setting以及Mail

 

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

ABP源码分析七:Setting以及Mail

 

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

ABP源码分析七:Setting以及Mail

 


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

 

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

 

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

定义缓存对象

ABP源码分析七:Setting以及Mail

 

读入缓存

ABP源码分析七:Setting以及Mail

 

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

ABP源码分析七:Setting以及Mail

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

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

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

ABP源码分析七:Setting以及Mail

 

 

 


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

 

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

ABP源码分析七:Setting以及Mail

 

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

ABP源码分析七:Setting以及Mail

 

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

 

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

 

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

 

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

ABP源码分析七:Setting以及Mail

 

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

  • 海报
海报图正在生成中...
赞(0) 打赏
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
文章名称:《ABP源码分析七:Setting以及Mail》
文章链接:https://www.456zj.com/20470.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址