ABP模块运行解析
从官方创建一份ASP.NET CORE 2.0的项目,并加入源码调试,可以看出如下图的加载顺序

1.ABP是通过什么样的机制加载的
既然ABP中模块需要添加DLL到引用中,又要加入DependsOn在类前面,前者已经在程序集中加入了,后天是做的什么工作?
现有Module A依赖Module B

假设Module B 和Module A都是静态类,可能就不需要进行物理关联了,DependsOn也是没有什么用的。
通过分析源码可以看出,整个ABP实际就是对依赖注册和控制反转的管理。ABP Modules也不例外。
2.ABP的模块如何调用依赖模块中的其他类,例如

例如ModuleB有IUserService和IRoleService,那么我们如何调用他呢。
在IOC架构的系统中,万年不变的顺序就是
(1)找到相关类,并通过Ioc注册
(2)使用的时候通过控制反转,依赖注入即可
在ABP中,模块的加载,只负责各个模块的加载、释放。不负责具体模块内的类注册。
在ABP中,各个模块中需要注册使用的类通过PreInitialize方法进行自行管理。
例如 Abp.AutoMapper中的AbpAutoMapperModule
public override void PreInitialize()
{
IocManager.Register<IAbpAutoMapperConfiguration, AbpAutoMapperConfiguration>(); Configuration.ReplaceService<ObjectMapping.IObjectMapper, AutoMapperObjectMapper>(); Configuration.Modules.AbpAutoMapper().Configurators.Add(CreateCoreMappings);
}
3.系统核心的类是通过什么方式注入的
ABP系统核心的类注册都放到了Abp.Dependency.Installers 下的AbpCoreInstaller.cs文件中
通过AbpBootstrapper.Initialize 来注册 IocManager.IocContainer.Install(new AbpCoreInstaller());
/// <summary>
/// Initializes the ABP system.
/// 初始化ABP系统
/// </summary>
public virtual void Initialize()
{
//获取日志
ResolveLogger(); try
{
//获取启动类
RegisterBootstrapper();
//注册基础的类
IocManager.IocContainer.Install(new AbpCoreInstaller());
//获取插件 添加PlugInSources
IocManager.Resolve<AbpPlugInManager>().PlugInSources.AddRange(PlugInSources);
//获取AbpStartupConfiguration 并初始化
IocManager.Resolve<AbpStartupConfiguration>().Initialize();
//使用Abp模块管理器
_moduleManager = IocManager.Resolve<AbpModuleManager>();
//初始化模块
_moduleManager.Initialize(StartupModule);
//启动模块
_moduleManager.StartModules();
}
catch (Exception ex)
{
_logger.Fatal(ex.ToString(), ex);
throw;
}
}
4.ABP是否支持插件式方式加载
官方目前所有的实例,都是通过引用加载DLL来实现依赖。实际上ABP是支持Plugins方式指定目录存放DLL文件的。
这也不难理解,既然ABP的Module工作方式,是独立的,那么DLL程序集存放在哪里都是一样的。
在官方给出的文档 已有说明 https://aspnetboilerplate.com/Pages/Documents/Module-System
我们可以通过AddAbp服务实现
services.AddAbp<MyStartupModule>(options =>
{
options.PlugInSources.Add(new FolderPlugInSource(@"C:\MyPlugIns"));
});
5.了解了ABP的模块工作方式,我们就可以依葫芦画瓢,实现相同的工作原理。
实际上我再关注另一个框架 http://www.zkweb.org/ 其模块依赖的原理是跟ABP一样的,实现方法不一样而已。
ABP模块运行解析的更多相关文章
- ABP+AdminLTE+Bootstrap Table权限管理系统第三节--abp分层体系,实体相关及ABP模块系统
返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 ABP模块系统 说了这么久,还没有详细说到abp框架,abp其实基于DDD(领域驱动设计)原则的细看分层如下: 再 ...
- ABP(现代ASP.NET样板开发框架)系列之4、ABP模块系统
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之4.ABP模块系统 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...
- Unity加载模块深度解析(Shader)
作者:张鑫链接:https://zhuanlan.zhihu.com/p/21949663来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 接上一篇 加载模块深度解析(二 ...
- Unity加载模块深度解析(网格篇)
在上一篇 加载模块深度解析(一)中,我们重点讨论了纹理资源的加载性能.这次,我们再来为你揭开其他主流资源的加载效率. 这是侑虎科技第53篇原创文章,欢迎转发分享,未经作者授权请勿转载.同时如果您有任何 ...
- 基于DDD的.NET开发框架 - ABP模块设计
返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...
- ABP模块设计
ABP模块设计 返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术 ...
- ABP模块系统
ABP模块系统 基于DDD的现代ASP.NET开发框架--ABP系列之4.ABP模块系统 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP ...
- PS常见错误-无法完成请求,因为文件格式模块不能解析该文件
无法完成请求,因为文件格式模块不能解析该文件 将图片格式变成.jpg格式就可以了
- perl6 JSON::Fast模块json解析的使用
关于JSON: JSON (JavaScript Object Notation)是一种轻量级的数据交换格式,语法简单,各种语言都有相应的库或者模块支持. 因为JSON非常小巧,解析起来又非常简单,我 ...
随机推荐
- C++ 单例模式实现
#include <iostream> #include <mutex> std::mutex mtx; class Singleton { private: Singleto ...
- 自己动手实现java数据结构(八) 优先级队列
1.优先级队列介绍 1.1 优先级队列 有时在调度任务时,我们会想要先处理优先级更高的任务.例如,对于同一个柜台,在决定队列中下一个服务的用户时,总是倾向于优先服务VIP用户,而让普通用户等待,即使普 ...
- angular监听dom渲染完成,判断ng-repeat循环完成
一.前言 最近做了一个图片懒加载的小插件,功能需要dom渲染完成后,好获取那些需要懒加载的dom元素.那么问题来了,如果只是感知静态的dom用ready,onload都可以,但项目用的angular, ...
- git第八节---git 撤销和回滚
# git 撤销 1. 未添加进暂存区的撤销 --未git add 2.添加进暂存区的撤销-- 已git add 未git commit 未添加进暂存区的撤销命令:git checkout -- ...
- Jenkins入门之界面概览
安装完Jenkins后,打开浏览器,在浏览器地址栏内输入http://localhost:8080/ 便可以打开jenkins 基于web的管理界面(如果你在安装过程中修改了Jenkins默认端口,则 ...
- IdentityServer4 中文文档 -8- (快速入门)设置和概览
IdentityServer4 中文文档 -8- (快速入门)设置和概览 原文:http://docs.identityserver.io/en/release/quickstarts/0_overv ...
- Gulp Error: Cannot find module 'jshint/src/cli'
I'm following sitepoint's An introduction to Gulp.js, but I'm stuck on step four, when I try to run ...
- 关于height,line-height导致的样式混乱的问题
设置固定border,padding,line-height,但是发现在ie下input标签竟然line-height不起作用,导致实际的高度无法控制 解决方法:添加固定高度height.
- vb.net 发Mail
Private Sub A1() '创建发件连接,根据你的发送邮箱的SMTP设置填充 Dim a As System.Net.Mail.Attachment Dim smtp As New Syste ...
- 搜藏一个php文件上传类
<?php /** * 上传文件类 * @param _path : 服务器文件存放路径 * @param _allowType : 允许上传的文件类型和所对应的MIME * @param _f ...