ABP的模块非常方便我们扩展自己的或使用ABP提供的模块功能,对于ABP自身提供的模块间的依赖关系想一探究竟,并且试着把不必要的模块拆掉,找到那部分核心模块。本次使用的是AspNetBoilerplate

源码下载

从Github下载ABP源码后,进入src文件夹,提供的大部分模块都在此中。很多工具也经ABP封装,个人认为是方便了集成使用且融入到ABP这个框架。

src文件夹中的类库有几种类型如.net standard(为了兼容.net framework)、.net 5 、.net framework的。

我的想法是最小的模块引用,因此按照如下两个条件移除

  • 移除.net framework的,只专注于.net core所需要的。
  • 移除Zero模块。

精简模块

整理后也就是剩下这部分,这样看仍然感觉有很多模块,但对于其中大部分来讲更多的是将一些工具封装了下,比如从SignalR,AutoMapper,Log4Net,Dapper,EFCore等等。

通过整理这部分类库间的依赖关系,(此图中去掉了Dapper、NHibernate、MemoryDB和MongoDb),如此一来分类便清晰许多,一眼便可以识别出Abp这一核心模块。哪些模块的提供的功能是什么,这样也方便查看。

我们再来建立一个项目来直接对该部分类库引用,而不是走Nuget包的方式。先依赖需要的最基本的模块,比如Abp、Abp.WebCommon和Abp.AspNetCore等几个模块,能够保障最基本的请求功能,甚至于读取数据库的ORM工具都不纳入进来。

依赖核心模块

此处将Log4Net作为需要的模块纳入进来,因为Abp中部分地方记录日志时候需要相应的实现类,当然也可以使用其他日志组件如NLog等,但需要实现Abp中封装好的抽象类,可参考如下链接:https://www.cnblogs.com/donaldtdz/p/8213440.html

新建一个空白解决方案AbpIntegrationDemo.sln

  • 建立一个module文件夹用于放置上述最基本模块。
  • 建立一个src文件夹中用于搭建分层结构。

对于src中的每一层所依赖的项目按照层次关系及依赖关系,其中核心层Domain依赖Abp模块,Application和Infrastructure都依赖核心层也就都对Abp模块有了依赖关系了。

如此一来,最为基本的依赖便完成了,各层内增加相应的Module,按照Abp模块化构建方式将这些模块贯穿起来。比如AbpIntegrationDemo.Admin,将依赖的模块,需要注入的、配置的东西加入进来,此处部分直接从Abp start up中搬过来的,还可以再精简一下,部分内容目前是没有用到的。

[DependsOn(
typeof(AbpIntegrationApplicationModule),
typeof(AbpIntegrationInfrastructureModule),
typeof(AbpAspNetCoreModule)
)]
public class AbpIntegrationAdminModule : AbpModule
{
private readonly IWebHostEnvironment _env;
private readonly IConfiguration _appConfiguration; public AbpIntegrationAdminModule(IWebHostEnvironment env, IConfiguration appConfiguration)
{
_env = env;
_appConfiguration = appConfiguration;
} public override void PreInitialize()
{
Configuration.DefaultNameOrConnectionString = _appConfiguration.GetConnectionString(AbpIntegrationDomainConsts.ConnectionStringName);
Configuration.Modules.AbpWebCommon().SendAllExceptionsToClients = false;
} public override void Initialize()
{
IocManager.RegisterAssemblyByConvention(typeof(AbpIntegrationAdminModule).GetAssembly());
} public override void PostInitialize()
{
IocManager.Resolve<applicationpartmanager>()
.AddApplicationPartsIfNotAddedBefore(typeof(AbpIntegrationAdminModule).Assembly);
} public override void Shutdown()
{
base.Shutdown();
}
}

在此基础上,按照需要的模块,如EF Core、Redis、Hangfire、AutoMapper等等,也只需要引用进来了,至少到现有地步,对于Abp模块的依赖及最为核心的模块应该是清楚了,而对于看到很多人说Abp重的说法,个人感觉是不是看到依赖的模块太多而有种复杂的感觉,实则有很多是工具模块,即使不使用Abp,实际开发中也会使用进来。

https://gitee.com/530521314/Partner.TreasureChest/tree/master/AbpIntegrateDemo

2021-08-19,望技术有成后能回来看见自己的脚步

精简ABP的模块依赖的更多相关文章

  1. ABP框架 - 模块系统

    文档目录 本节内容: 简介 模块定义 生命周期方法 PreInitialize(预初始化) Initialize(初始化) PostInitialize(提交初始化) Shutdown(关闭) 模块依 ...

  2. ABP理论学习之依赖注入

    返回总目录 本篇目录 什么是依赖注入 传统方式产生的问题 解决办法 依赖注入框架 ABP中的依赖注入基础设施 注册 解析 其他 ASP.NET MVC和ASP.NET Web API集成 最后提示 什 ...

  3. ABP之模块分析

    本篇作为我ABP介绍的第三篇文章,这次想讲下模块的,ABP文档已经有模块这方面的介绍,但是它只讲到如何使用模块,我想详细讲解下它模块的设计思路. ABP 框架提供了创建和组装模块的基础,一个模块能够依 ...

  4. ABP之模块

    ABP的反射 为什么先讲反射,因为ABP的模块管理基本就是对所有程序集进行遍历,再筛选出AbpModule的派生类,再按照以来关系顺序加载. ABP对反射的封装着重于程序集(Assembly)与类(T ...

  5. ABP之模块系统

    简介 ASP.NET Boilerplate提供了构建模块的基础结构,并将它们组合在一起以创建应用程序. 模块可以依赖于另一个模块. 通常,一个程序集被视为一个模块. 如果创建具有多个程序集的应用程序 ...

  6. ABP中的依赖注入思想

    在充分理解整个ABP系统架构之前首先必须充分了解ABP中最重要的依赖注入思想,在后面会具体举出一些实例来帮助你充分了解ABP中的依赖注入思想,在了解这个之前我们首先来看看什么是依赖注入?来看看维基百科 ...

  7. ABP新增模块可能遇到的问题

    当我们新增一个模块时: public class SSORedisModule: AbpModule { //public override void PreInitialize() //{ // b ...

  8. Angular JS的模块依赖

    AngularJS是纯客户端技术,完全用Javascript编写的.它使用的是网页开发的常规技术(HTML,CSS,Javascript),目的是让网页应用开发更快更容易. AngularJS简化应用 ...

  9. 谈谈.net模块依赖关系及程序结构

    技术为解决问题而生. 上面这个命题并非本文重点,我将来有空再谈这个.本文也并非什么了不起的技术创新,只是分享一下我对.net模块依赖关系及程序结构方面的一些看法.先看一个最最简单的hello worl ...

随机推荐

  1. Linux之 du的用法

    du 显示目录和文件的大小,常用命令为 du -sh * du -sm * | sort -n //统计当前目录大小 并按大小 排序 du 无参数 显示当前路径下的目录大小和子目录大小 -b/-k/- ...

  2. mysql中,一个数字加上null,结果为null

    在mysql中,一个数字加上null,结果为null. 这个问题是我用update语句时遇见的,就像下边的例子 update tableName set number = number + x 这里的 ...

  3. C语言:渔夫打鱼晒网问题

    //如果一个渔夫从 2011 年 1 月 1 日开始三天打渔,两天晒网,编程实现当输入 2011 1 月 1 日以后的任意一天,输出该渔夫是在打渔还是在晒网. #include <stdio.h ...

  4. 【论文阅读】套娃之 Blog for DMP Dynamic Movement Primitives

    前言:原笔记Notion链接:https://www.notion.so/Blog-for-DMP-d34e83c05eb944ba989fc8bf9b0c0f7b 如有格式显示问题等请点击此处查看 ...

  5. File类与常用IO流第一章File类

    第一章:File类 一.1个重点单词: file:文件:directory:文件夹/目录:path:路径(绝对路径:absolutePath) 二.4个静态成员变量: 1.static String ...

  6. js浮点数保留位数方法封装

    大家在平时业务中应该经常跟小数打交道吧,有没有被小数点的保留位数问题搞得头疼啊.比如,保留一位小数,保留俩位小数,保留三位小数,向上取整.四舍五入等等. 而我最近在项目中正好遇到类似的问题:有的地方要 ...

  7. selenium3 + python - js&jquery操作处理

    # 推荐学习:https://www.w3school.com.cn/js/index.asp## 下面以简书登录&注册定位元素为例"""js定位 id name ...

  8. 微信小程序云开发-云存储-上传文件(图片/视频)到云存储 精简代码

    说明 图片/视频这类文件是从客户端会话选择文件. 一.wxml文件添加if切换显示 <!--上传文件到云存储--> <button bindtap="chooseImg&q ...

  9. C++第四十篇 -- 研究一下Windows驱动开发(三)-- NT式驱动的基本结构

    对于NT式驱动来说,主要的函数是DriverEntry例程.卸载例程及各个IRP的派遣例程. 一.驱动加载过程与驱动入口函数(DriverEntry) 和编写普通应用程序一样,驱动程序有个入口函数,也 ...

  10. ts 学习笔记 - 进阶篇 1

    目录 进阶 类型别名 字符串字面量类型 元祖 例子 越界的元素 枚举 手动赋值 常数项和计算所得项 常数枚举 外部枚举 进阶 类型别名 类型别名用来给一个类型起个新名字 type Name = str ...