【转】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源码分析系列文章目录

Q:一个设置配置,怎么搞的这么复杂。。
A:我想这应该是设计中严格遵循单一职责原则的必然结果:大量细小的类和看似复杂的关系。

Q:请问楼主最后的代码图是怎么生成的呢,插件还是vs自带的
A:VS 自带的,企业版和旗舰版有

SettingDefinitionProviderContext 提供上下文,可以通过上下文修改框架设定或自定义模块的设定

例如:
public override IEnumerable<SettingDefinition> GetSettingDefinitions(SettingDefinitionProviderContext context)
{
context.Manager.GetSettingDefinition(LocalizationSettingNames.DefaultLanguage).DefaultValue = “zh-cn”;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java流换行符方法_java换行符的使用方法

java换行符的使用方法发布时间&#xff1a;2020-06-22 17:49:56来源&#xff1a;亿速云阅读&#xff1a;121作者&#xff1a;Leah这篇文章将为大家详细讲解有关java换行符的使用方法&#xff0c;小编觉得挺实用的&#xff0c;因此分享给大家做个参考&#xff0c;希望大家阅读完…

【转】ABP源码分析八:Logger集成

ABP使用Castle日志记录工具&#xff0c;并且可以使用不同的日志类库&#xff0c;比如&#xff1a;Log4Net, NLog, Serilog... 等等。对于所有的日志类库&#xff0c;Castle提供了一个通用的接口来实现&#xff0c;我们可以很方便的处理各种特殊的日志库&#xff0c;而且当业务需…

java并发锁获取的方式_Java精通并发-notify方法详解及线程获取锁的方式分析

wait()&#xff1a;在上一次https://www.cnblogs.com/webor2006/p/11404521.html中对于无参数的wait()方法的javadoc进行了解读&#xff0c;而它是调用了一个参数的重载方法&#xff0c;回忆下&#xff1a;其中如果传0代表无限等待&#xff0c;否则是等待指定的时间就会停止等待…

【转】ABP源码分析九:后台工作任务

文主要说明ABP中后台工作者模块&#xff08;BackgroundWorker&#xff09;的实现方式&#xff0c;和后台工作模块&#xff08;BackgroundJob&#xff09;。ABP通过BackgroundWorkerManager来管理BackgroundJobManager&#xff0c;然后通过BackgroundJobManager来管理Background…

java引入resource下的模板_Beetl自定义ResourceLoader,实现特殊的模板加载需求

一直以来&#xff0c;有个目标是&#xff1a;使用Beetl的时候&#xff0c;如果web root 里有模板文件&#xff0c;则beetl从web root里加载。如果没有&#xff0c;则从jar里加载&#xff0c;或者从Db里加载。这样&#xff0c;工程里大量相同的模板模板可以共用(当你的应用&…

【转】ABP源码分析十:Unit Of Work

ABP以AOP的方式实现UnitOfWork功能。通过UnitOfWorkRegistrar将UnitOfWorkInterceptor在某个类被注册到IOCContainner的时候&#xff0c;一并添加到该类在容器中对应的ComponentModel的Interceptors集合中。总结一句话就是&#xff0c;UOW的功能是通过自定义Castle拦截器来实现…

java光标位置无效_java - java.sql.SQLException:无效的光标位置 - 堆栈内存溢出

我创建了一个简单的应用程序&#xff0c;使用户可以购买门票。 但是&#xff0c;每当我尝试购买“ n”张门票时&#xff0c;都会遇到此错误。 现在&#xff0c;我知道在使用数据库进行操作时需要crs.next()语句&#xff0c;我已经使用了很多次&#xff0c;但是由于某种原因&…

【转】C#命名空间大全详细教程

www.51rgb.com System 命名空间包含了定义数据类型、事件和事件处理程序等基本类&#xff1b; System.Data 命名空间包含了提供数据访问功能的命名空间和类&#xff1b; System.IO 命名空间包含了数据流读写相关功能的类&#xff1b; System.Windows.Forms 命名空间包含了W…

java构造方法的签名_如何在 Java 中构造对象(学习 Java 编程语言 034)

1. 构造器Java 对象都是在堆中构造的。先看看 Employee 类的构造器&#xff1a;public class Employee {private String name;private double salary;private LocalDate hireDay;public Employee(String name, double salary, int year, int month, int day) {this.name name;…

【转】ABP源码分析十一:Timing

Timing这个简单实用的功能主要用来以统一的方式表示时间。因为ABP中有大量的module,另外还支持自定义module&#xff0c;所以将时间统一表示为local时间&#xff08;默认&#xff09;或utc时间是必要的。 IClockProvider:提供获取当前时间和标准化时间的接口。 UtcClockProvide…

java更改背景_java – 使用jquery更改menue的背景颜色

我正在尝试用Zenphoto建立一个照片库.他们使用PHP,可以添加这样的自定义菜单&#xff1a;PHP printCustomMenu(main_menue); ?>我改变了sylesheet中整个事物的外观,看起来像这样&#xff1a;#navmenu {width: 1000px;height: 42px;margin: 0px auto 30px auto;font-family:…

【转】ABP源码分析十二:本地化

本文逐个分析ABP中涉及到localization的接口和类&#xff0c;以及他们之间的关系。本地化主要涉及两个方面&#xff1a;一个是语言&#xff08;Language&#xff09;的管理&#xff0c;这部分相对简单。另一个是语言对应得本地化资源&#xff08;Localization&#xff09;的管理…

pandas 批量修改列名_pandas修改DataFrame列名的方法

在做数据挖掘的时候&#xff0c;想改一个DataFrame的column名称&#xff0c;所以就查了一下&#xff0c;总结如下&#xff1a;数据如下&#xff1a;>>>import pandas as pd>>>a pd.DataFrame({A:[1,2,3], B:[4,5,6], C:[7,8,9]})>>> aA B C0 1 4 7…

【转】ABP源码分析十三:缓存Cache实现

ABP中有两种cache的实现方式&#xff1a;MemoryCache 和 RedisCache. 如下图&#xff0c;两者都继承自ICache接口&#xff08;准确说是CacheBase抽象类&#xff09;。ABP核心模块封装了MemoryCache 来实现ABP中的默认缓存功能。 Abp.RedisCache这个模块封装RedisCache来实现缓存…

java 酒店预定 app_Android应用源码酒店在线预定app项目全套

【实例简介】Android应用源码酒店在线预定app项目全套【实例截图】【核心代码】package com.bn.summer;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;…

java peer_Java PeerConnection.getStats方法代码示例

import org.webrtc.PeerConnection; //导入方法依赖的package包/类Overridepublic void onIceServers(List iceServers) {factory new PeerConnectionFactory();MediaConstraints pcConstraints appRtcClient.pcConstraints();pcConstraints.optional.add(new MediaConstrain…

【转】ABP源码分析十四:Entity的设计

IEntity<TPrimaryKey>: 封装了PrimaryKey&#xff1a;Id,这是一个泛型类型 IEntity: 封装了PrimaryKey&#xff1a;Id,这是一个int类型 Entity<TPrimaryKey> &#xff1a;支持主键是泛型类型的Entity Entity&#xff1a;支持主键是int类型的Entity IHasCreation…

【转】ABP源码分析十五:ABP中的实用扩展方法

类名 扩展的类型 方法名 参数 作用 XmlNodeExtensions XmlNode GetAttributeValueOrNull attributeName Gets an attributes value from an Xml node. JsonExtensions object ToJsonString bool camelCase bool indented Converts given object to JSON …

php计算经纬度距离,php经纬度计算距离

/*** 计算两点地理坐标之间的距离* param Decimal $longitude1 起点经度* param Decimal $latitude1 起点纬度* param Decimal $longitude2 终点经度* param Decimal $latitude2 终点纬度* param Int $unit 单位 1:米 2:公里* param Int $decimal 精度…

【转】ABP源码分析十六:DTO的设计

IDTO:空接口&#xff0c;用于标注Dto对象。 ComboboxItemDto&#xff1a;用于combobox/list中Item的DTO NameValueDto<T>/NameValueDto:用于name value键值对的DTO&#xff0c; name为string类型&#xff0c; value为泛型或string类型。 Entity Dto IEntityDto<TPri…