【转】ABP源码分析三:ABP Module

Abp是基于模块化设计思想进行构建的。开发人员可以将自定义的功能以模块(module)的形式集成到ABP中。具体的功能都可以设计成一个单独的Module。Abp底层框架提供便捷的方法集成每个Module.下图是所有Abp自带的module.AbpModule是所有Module的基类,其已经拥有了IIocManager和IAbpStartupConfiguration的受保护的成员,从其派生的Module都可以直接获取并使用相关的功能(依赖注入,Configuration)。:

 

以下以AbpWebMvcModule为例,这个就是Abp自定义的一个模块,该模块继承自AbpModule。 那么这个模块是怎么和Abp底层框架集成到一块的呢?


所谓集成可以从两个角度开看:

第一,Abp底层框架是如何发现这个Module的?

第二,这个Module是如何把自己的组件(类,接口)注册到Abp底层框架中(AbpWebMvcModule中,这问题就演变为:如何把Controller注册到Abp底层框架的容器中)?


先分析第二个问题: 如下代码中AbpWebMvcModule类中的PreInitialize 和 Initialize 很好的回答了这个问题。在PreInitialize中Abp调用IocManager的AddConventionalRegistrar方法,以实例化的ControllerConventionalRegistrar为参数。上一篇已介绍过ControllerConventionalRegistrar的用处,这个类的实例在执行RejisterAssembly时,会将继承自controller的类型都注入到Abp底层框架中(也就是Castle容器中)。 Initialize这注册了一个Castle的WindsorControllerFactory以替换MVC下默认的ControllerFactory,这样ASP.NET MVC将使用WindsorControllerFactory从Castle容器中解析出controller.


AddConventionalRegistrar方法向IocManager的一个私有泛型集合List<IConventionalDependencyRegistrar>注册注册机制,通常所有的Module类的预初始化方法中调用以决定哪些类型需要被注册(如果没有就无需调用)

 

现在在看回第一个问题:Abp底层框架是如何发现这个Module的?

解释这个问题前,有必要解释一下Module的描述信息是如何被封装的。AbpModuleInfo用于封装AbpModule的基本信息。 AbpModuleCollection则是AbpModuleInfo的集合。

 

Abp底层框架发现Module是从AbpBootstrapper在执行Initialize方法的时候开始的,该方法会调用IAbpModuleManager实例的InitializeModules方法,这个方法接着调用DefaultModuleFinder的FindAll方法(该方法用于过滤出AbpModule的assembly),而FindAll方法调用TypeFinder得到所有的assembly. 所以只要你定义的assembly中有一个继承至AbpModule的类,并且该assembly被引用到你的项目中,那么这个Module就可以说会被Abp底层框架集成了。

具体关系如下图。

 

AbpModuleManager得到所有的AbpModule的AbpModuleInfo以后,逐个调用这些Module的PreInitialize,Initialize和PostInitialize以完成初始化。(注意,ABP先完成所有Module的PreInitialize,接着再执行所有Module的Initialize,最后执行PostInitialize。不是执行完一个Module的这三个方法,再去执行下一个Module的这三个方法。这个很好理解,如果是后者的话,我们只要一个Initialize方法就可以了,所有的方法都放入这个Initialize方法中即可。)至此,AbpWebMvcModule算是完成了和Abp底层框架的集成了。值得一提的是所有AbpModule的关闭销毁也是通过AbpModuleManager调用ShutdownModules来遍历执行AbpModule的Shutdown来实现的。

 

上面解释了关于自定义的模块的注册和初始化,那么Abp底层框架的一些功能模块的类型的注册如何实现的呢? 通过AbpKernelModule来实现的,该类会调用如下图中的各种Register完成初始化(拦截器的注入)。以后的文章会逐个解释这些功能模块。

 

 

 

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

 

博主你好,可以麻烦指点一下你这个代码图怎么生成的吗
vs2017安装一个组件,你安装2017的时候,找找,有个玩意叫做“体系结构和分析工具”。一般人还不告诉他。

不知道楼主当时用的是什么版本,现在的版本更新了很多子模块了。

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

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

相关文章

java weka 聚类_简单开源数据挖掘工具weka进行文本聚类

目前非代码的数据挖掘工具很多&#xff0c;但非开源&#xff0c;weka是一款开源软件。只要安装jdk环境就可使用(具体安装jdk可以百度)本文将论述如何不用代码&#xff0c;使用weka操作&#xff0c;通过与文档频数与单词权的特征选择方法进行文本聚类(数据为附件)第一步&#xf…

java 不识别enum_Java enum关键字不识别的快速解决办法

从别人那儿拷贝过来的myeclipse java工程&#xff0c;打开一看标红了一大片&#xff0c;仔细一看&#xff0c;原来是不识别enum关键字&#xff0c;这就有点尴尬了。我自己重新建了一个java工程&#xff0c;测试了下&#xff0c;假如我在新建工程的时候选择javase-1.6&#xff1…

【转】ABP源码分析四:Configuration

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

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

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

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

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

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

ABP的依赖注入的实现有一个本质两个途径&#xff1a;1.本质上是依赖于Castle这个老牌依赖注入的框架。2.一种实现途径是通过实现IConventionalDependencyRegistrar的实例定义注入的约定&#xff08;规则&#xff09;&#xff0c;然后通过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一般用于需要通过外部配置文件&#xff08;或数据库&#xff09;设置的简单类型数据&#xff08;一般就是字符串&#xff09;&#xff0c;比如SMTP HOST.…

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;的管理…