【转】ABP源码分析四:Configuration

核心模块的配置

Configuration是ABP中设计比较巧妙的地方。其通过AbpStartupConfiguration,Castle的依赖注入,Dictionary对象和扩展方法很巧妙的实现了配置中心化。配置中心化是一个支持模块开发的框架必备功能。

 

ABP中核心功能模块中的一些功能的运行时的行为是依赖于一些外部配置的。这一点应该不难理解。 简单解释下,比如Localization这个功能模块,最基本Abp需要知道要做哪些语言的本地化。而这些具体的配置对于Abp底层框架来说是不可预知的,那么ABP底层框架就很有必要提供一种手段供外部模块自定义Congfiguration. 这就是下文要分析的IAbpStartupConfiguration和他的小伙伴们(各种I***Configuration)。 下图描述了这些Configuration之间的关系(稍后解释)。

(图一)

 

上面图中的都是接口,我们还需要知道这些接口的实例对象是在哪里生成的呢?

这要看回AbpBootstrapper的Initialize方法了(AbpBootstrapper在前面的文章已有介绍)。
首先,第一行通过AbpCoreInstaller注册的是系统框架级的所有configuration.
接着通过容器生成IAbpStartupConfiguration的实例AbpStartupConfiguration对象。
最后调用AbpStartupConfiguration的Initialize方法,该方法最终调用容器生成他的小伙伴的各种实例(****Configuration)。

(图二)

 

(图三)

 

ABP的作者为了方便管理,他把所有需要在ABP初始化阶段就要被实例化的接口都放到了Startup文件夹下(贴心啊!)。

 (图四)

 

至此,ABP核心功能组件的Configuration就已经完成实例化了, 此后需要调用或修改某个组件的Configuration,只要引用其IAbpStartupConfiguration的实例Configuration即可访问各个组件的Configuration了。如下图AbpModule下的Configuration其实就是AbpStartupConfiguration,是一个单例。而Localization就是AbpStartupConfiguration实例的一个小伙伴LocalizationConfiguration。通过它就可以配置本地化了。同样的逻辑也适合其他****Configuration。

 (图五)

 

 

自定义模块的配置

上面基本解释了Abp核心功能模块的配置的运作方式,接下来在分析下自定义module的Configuration 是如何实现的。下图描述了Abp中哪些原生Module会有自定义的configuration.(请注意箭头的方向,和第一张图中的箭头方向是相反的。)

 

Abp底层框架清楚有哪些核心功能模块,所以就很自然的给每个核心功能模块各自定义一个Configuration接口。但是Abp底层框架并不知道自定义的module有哪些,所以也就无法给每个自定义的module都创建一个Configuration接口。那么ABP底层框架是怎么管理每个自定义的module的Configuration的呢?

如果仔细观察图一的话,我们发现IAbpStartupConfiguration引用了一个IDictionaryBasedConfig的接口对象,IDictionaryBasedConfig的实现是DictionaryBasedConfig如下图。DictionaryBasedConfig下有个dictionary,这个就是最终保存自定义的module的Configuration的地方,因为Configuration的类型未知,所以dictionary的value是object类型。

 

下面以AbpWebModule为例讲一下自定义的module是如何实现Configuration。
第一步, 如下图, AbpWebModule定义了自己的接口IAbpWebModuleConfiguration和AbpWebModuleConfiguration,以及AbpConfigurationExtension

 

第二步, 如下图, 在AbpWebModule的preInitialize方法中将接口IAbpWebModuleConfiguration和其实现AbpWebModuleConfiguration注册到容器中。

 

第三步, 如下图, 看下AbpConfigurationExtension的实现。这是一个扩展方法,扩展了IModuleConfigurations接口,这个接口是在Abp底层框架中定义和实现的。其属性AbpConfiguration就是AbpStartupConfiguration实例。通过AbpStartupConfiguration的getorCreate方法(具体通过DictionaryBasedConfig来实现)就可以获取到AbpWebModule自定义的AbpWebModuleConfiguration的实例了。

 

具体访问方式如下,Configuration.Modules就是IModuleConfigurations的实例。通过其扩展方法AbpWeb访问AbpWebModuleConfiguration

Configuration.Modules.AbpWeb.SendAllExceptionsToClients=True;

 

最后这张图列出了AbpStartupConfiguration的所有可访问的configuration。

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

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

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

相关文章

java 实现 堆和栈_JAVA中的堆和栈

JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。差异:1.堆内存用来存放由new…

【转】ABP源码分析五:ABP初始化全过程

ABP在初始化阶段做了哪些操作,前面的四篇文章大致描述了一下。 为个更清楚的描述其脉络,做了张流程图以辅助说明。其中每一步都涉及很多细节,难以在一张图中全部表现出来。每一步的细节(会涉及到较多接口,类&#xff0…

【转】ABP源码分析六:依赖注入的实现

ABP的依赖注入的实现有一个本质两个途径:1.本质上是依赖于Castle这个老牌依赖注入的框架。2.一种实现途径是通过实现IConventionalDependencyRegistrar的实例定义注入的约定(规则),然后通过IocManager来读取这个规则完成依赖注入。…

java从小到大排序函数_利用随机函数产生10个1~100之间的整数,按从小到大的顺序排列输出...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼public interface planeGraphics2{public abstract double area();public abstract double perimeter();public abstract void print();}public class rectangle2 implements planeGraphics2{protected double length;protected do…

【转】ABP源码分析七:Setting 以及 Mail

本文主要说明Setting的实现以及Mail这个功能模块如何使用Setting. 首先区分一下ABP中的Setting和Configuration。 Setting一般用于需要通过外部配置文件(或数据库)设置的简单类型数据(一般就是字符串),比如SMTP HOST.…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1. 构造器Java 对象都是在堆中构造的。先看看 Employee 类的构造器: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,所以将时间统一表示为local时间(默认)或utc时间是必要的。 IClockProvider:提供获取当前时间和标准化时间的接口。 UtcClockProvide…

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

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

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

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

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

在做数据挖掘的时候,想改一个DataFrame的column名称,所以就查了一下,总结如下:数据如下:>>>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的实现方式:MemoryCache 和 RedisCache. 如下图,两者都继承自ICache接口(准确说是CacheBase抽象类)。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;…