从官方创建一份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模块运行解析的更多相关文章

  1. ABP+AdminLTE+Bootstrap Table权限管理系统第三节--abp分层体系,实体相关及ABP模块系统

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 ABP模块系统 说了这么久,还没有详细说到abp框架,abp其实基于DDD(领域驱动设计)原则的细看分层如下: 再 ...

  2. ABP(现代ASP.NET样板开发框架)系列之4、ABP模块系统

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之4.ABP模块系统 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...

  3. Unity加载模块深度解析(Shader)

    作者:张鑫链接:https://zhuanlan.zhihu.com/p/21949663来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 接上一篇 加载模块深度解析(二 ...

  4. Unity加载模块深度解析(网格篇)

    在上一篇 加载模块深度解析(一)中,我们重点讨论了纹理资源的加载性能.这次,我们再来为你揭开其他主流资源的加载效率. 这是侑虎科技第53篇原创文章,欢迎转发分享,未经作者授权请勿转载.同时如果您有任何 ...

  5. 基于DDD的.NET开发框架 - ABP模块设计

    返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

  6. ABP模块设计

    ABP模块设计 返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术 ...

  7. ABP模块系统

    ABP模块系统 基于DDD的现代ASP.NET开发框架--ABP系列之4.ABP模块系统 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP ...

  8. PS常见错误-无法完成请求,因为文件格式模块不能解析该文件

    无法完成请求,因为文件格式模块不能解析该文件 将图片格式变成.jpg格式就可以了

  9. perl6 JSON::Fast模块json解析的使用

    关于JSON: JSON (JavaScript Object Notation)是一种轻量级的数据交换格式,语法简单,各种语言都有相应的库或者模块支持. 因为JSON非常小巧,解析起来又非常简单,我 ...

随机推荐

  1. Python中property的使用

  2. C#7.0--引用返回值和引用局部变量

    一.在C#7.0以上版本中,方法的返回值可以通过关键字ref指定为返回变量的引用(而不是值)给调用方,这称为引用返回值(Reference Return Value,或ref returns): 1. ...

  3. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十三):系统备份还原

    系统备份还原 在很多时候,我们需要系统数据进行备份还原.我们这里就使用MySql的备份还原命令实现系统备份还原的功能. 新建工程 新建一个maven项目,并添加相关依赖,可以用Spring boot脚 ...

  4. ES启动报错之引导检测失败

    [--16T18::,][ERROR][o.e.b.Bootstrap ] [node-] node validation exception [] bootstrap checks failed [ ...

  5. WebApi开启CORS支持跨域POST

    概念:CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源服务器,发出XMLHttpRequest请求 ...

  6. [PKUWC 2018]随机游走

    Description 题库链接 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次询问给定一个集合 \(S\) ...

  7. python学习笔记01--基础

    一.解释型语言 python是一门解释型语言,这意味着: l  编写过后的代码不用编译连接即可运行,节约调试时间 l  python的解释器在大多数系统中都有很好实现,所以编写的代码可以运行在任何系统 ...

  8. EXTJS4 Grid Filter 插件的使用 与后台数据解析------Extjs 查询筛选功能的实现

    先汗一个,一个小功能又踢腾了一天.本来这个带Demo的,但是上面介绍的不是很详细.用的时候问题不大,主要问题在文件导入方面.以为这个插件的使用和其他的不一样. 1.首先是需要引入文件的位置:如图 需要 ...

  9. layui 文字滚动

    将消息标题滚动 上面是效果 <li class="layui-nav-item"> <div class="layui-carousel" i ...

  10. [PHP] 算法-请找出带环链表的环的入口结点的PHP实现

    给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null 1.找链表倒数第k个结点,输入一个链表,输出该链表中倒数第k个结点.第一个指针走(k-1)步,到达第k个节点,两个指针同时往后 ...