本文主要说明Setting的实现以及Mail这个功能模块如何使用Setting. html
首先区分一下ABP中的Setting和Configuration。 web
Setting通常用于须要经过外部配置文件(或数据库)设置的简单类型数据(通常就是字符串),好比SMTP HOST.数据库
Configuration通常只须要经过内部代码完成的配置,通常用于设置复杂类型的数据。数组
目前Abp在setting 这个功能模块只能从配置文件读取设置,没法从其余source(好比数据库)读取设置。也能够自定义SettingStore而后注入到ABP中来实现从其余Source读取设置(非本文重点)。缓存
Setting如何实现的:框架
首先咱们要定义一个Setting,也就是说咱们须要设置什么? 这个就是SettingDefinition。, ide
SettingDefinition/SettingDefinitionGroup, 用于定义Setting。不一样的Name标识不一样的Setting。假如要配置SMTP HOST,那么就能够定义一个name="Abp.Net.Mail.Smtp.Host" 的SettingDefinition。注意: Name和DefaultValue必需要的属性,其余都是辅助属性。SettingDefinitionGroup用于给SettingDefinition分组,Abp底层框架彷佛没有真正使用过这个类。源码分析
下面这个图说明SettingDefinition/SettingDefinitionGroup定义了哪些属性及他们的关系。spa
SettingScopes:这是一个标注了Flags特性的枚举类型,表示setting的应用范围。3d
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: 用于发送邮件。
最后,照旧图示他们之间的关系。