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,望技术有成后能回来看见自己的脚步

最新文章

  1. SQL函数
  2. Tomcat源码分析之—容器整体结构
  3. 在生产环境使用Docker部署应用
  4. Android Intent个人介绍
  5. Oracle学习【语句查询】
  6. Win8 使用VC6.0调试
  7. android tv 全屏幕垂直画
  8. mongodb综述
  9. 【&#9733;】RSA-什么是不对称加密算法?
  10. 一种dubbo逻辑路由方案(服务化隔离环境)
  11. Day4_迭代器
  12. PC端实现微信登录浅析
  13. [Swift]LeetCode23. 合并K个排序链表 | Merge k Sorted Lists
  14. stm32 uart 中断 蜜汁bug
  15. 使用natapp将本地服务映射到外网
  16. windows批处理定时关机
  17. java 正则 贪婪匹配 匹配sql语句中的引号内容
  18. ubuntu 编译android 源码笔记
  19. js控制滚动条的位置以及隐藏滚动条
  20. Buff系统的实现

热门文章

  1. CentOS-Docker搭建MinIO(单点)
  2. JNI小记
  3. buu SimpleRev
  4. linux:mysql
  5. 大厂高级工程师面试必问系列:Java动态代理机制和实现原理详解
  6. Python----MongoDB数据库
  7. MIT6.828 Lab4 Preemptive Multitasking(下)
  8. Emoji.voto,Linkerd 服务网格(service mesh)的示例应用程序
  9. urllib库中的URL编码解码和GETPOST请求
  10. MySQL服务不见 - 解决方法