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非常小巧,解析起来又非常简单,我 ...
随机推荐
- 解决springmvc中使用redirect跳转后https变为http
方法一:配置文件修改ViewResolver的 redirectHttp10Compatible 属性,这个属性是为了兼容 http1.0协议. <bean id="viewResol ...
- 分布式文件系统FastDFS安装教程
前言 FastDFS(Fast Distributed File System)是一款开源轻量级分布式文件系统,本文不讲解原理和架构,只是在个人使用部署过程中耗费了好长时间和精力,遇到了很多的坑,于是 ...
- Scala函数与函数式编程
函数是scala的重要组成部分, 本文将探讨scala中函数的应用. scala作为支持函数式编程的语言, scala可以将函数作为对象即所谓"函数是一等公民". 函数定义 sca ...
- Ubuntu安装与配置
四.ubuntu下生成ngrok服务器主程序 4.1.步骤与先决条件 如果你只是临时穿透或调试用,到第三步基本就可以了,但如果想作为稳定的商业服务,用别人的服务器还是受制于人,这里我们准备搭建自己的n ...
- IDEA内置Git管理
总结: 1.要想用git管理项目,先要将本地项目与git关联,才能进行commit.push.pull等操作: 2.将本地项目于git关联后,本地仓库的地址默认就是项目地址: ...
- 从函数式编程到Promise
译者按: 近年来,函数式语言的特性都被其它语言学过去了.JavaScript异步编程中大显神通的Promise,其实源自于函数式编程的Monad! 原文: Functional Computation ...
- photoshop使用笔记-制作古代印章
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 第一步:新建图层400x400像素,白色背景的图层,并且复制图层 第二步:设置前景色为R230,G30,B30 第三步:选择圆角 ...
- java.lang.IllegalArgumentException Expected MultipartHttpServletRequest
解决方案:检查jar包,完毕无误后在Spring MVC的配置文件中加入: <!-- 需要文件上传功能时,启用以下配置 设置最大上传文件大小 10M=10*1024*1024(B)=104857 ...
- Redis 入门 安装 命令
win7 64位安装redis 及Redis Desktop Manager使用 引自:http://blog.csdn.net/joyhen/article/details/47358999 写基于 ...
- 一. Redis 常用命令
键值相关命令 1. KETS 查询所有的key 127.0.0.1:6379> keys * 1) "tony"2) "hexu1"3) "he ...