ABP 是 ASP.NET Boilerplate 的简称, ABP 是一个开源且文档友好的应用程序框架. ABP 不仅仅是一个框架, 它还提供了一个最徍实践的基于领域驱动设计 (DDD) 的体系结构模型. 学习使用 ABP 框架也有一段时间了, 一直想全面了解下这个框架的整个来龙去脉, 并把想把它使用历程整理成一个系列出来, 不过一直没有下笔来写这篇文章的开篇, 就是希望能够深入了解, 再深入了解一些, 希望自己能够理解透彻一些, 不能误人子弟, 也不想和网上千篇一律的翻译官网的内容, 官网的英文介绍也已经很详细了, 于是我觉得还是以实际使用的过程进行一定的整理会更好.
初次了解 ABP 框架, 对它还是非常惊艳的, 它基本上是. NET 领域架构的集大成者, 几乎囊括了我们. NET 领域排的上名的各种技术应用, 而且它本身可以支持. net framework 和. net core 两种技术流派, 对它的介绍也是非常感兴趣.
1)ABP 框架的特点
我们来大概了解下 ABP 框架涉及到的内容.
依赖注入, 这个部分使用 Castle windsor (依赖注入容器)来实现依赖注入, 这个也是我们经常使用 IoC 来处理的方式;
Repository 仓储模式, 已实现了 Entity Framework,NHibernate,MangoDB, 内存数据库等, 仓储模式可以快速实现对数据接口的调用;
身份验证与授权管理, 可以使用声明特性的方式对用户是否登录, 或者接口的权限进行验证, 可以通过一个很细粒度的方式, 对各个接口的调用权限进行设置;
数据有效性验证, ABP 自动对接口的输入参数对象进行非空判断, 并且可以根据属性的申请信息对属性的有效性进行校验;
审计日志记录, 也就是记录我们对每个接口的调用记录, 以及对记录的创建, 修改, 删除人员进行记录等处理;
Unit Of Work 工作单元模式, 为应用层和仓储层的方法自动实现数据库事务, 默认所有应用服务层的接口, 都是以工作单元方式运行, 即使它们调用了不同的存储对象处理, 都是处于一个事务的逻辑里面;
异常处理, ABP 框架提供了一整套比较完善的流程处理操作, 可以很方便的对异常进行进行记录和传递;
日志记录, 我么可以利用 Log4Net 进行常规的日志记录, 方便我们跟踪程序处理信息和错误信息;
多语言 / 本地化支持, ABP 框架对多语言的处理也是比较友好的, 提供了对 xml,JSON 语言信息的配置处理;
Auto Mapping 自动映射, 这个是 ABP 的很重要的对象隔离概念, 通过使用 AutoMaper 来实现域对象和 DTO 对象的属性映射, 可以隔离两者的逻辑关系, 但是又能轻松实现属性信息的赋值;
动态 web API 层, 利用这个动态处理, 可以把 Application Service 直接发布为 Web API 层, 而不需要在累赘的为每个业务对象手工创建一个 Web API 的控制器, 非常方便;
动态 JavaScript 的 Ajax 代理处理, 可以自动创建 JavaScript 的代理层来更方便使用 Web API, 这个在 Web 层使用.
除了这些重要特性外, ABP 框架还有很多一些特别的功能或者概念.
多租户支持(每个租户的数据自动隔离, 业务模块开发者不需要在保存和查询数据时写相应代码;
软删除支持(继承相应的基类或实现相应接口, 会自动实现软删除)
系统设置存取管理(系统级, 租户级, 用户级, 作用范围自动管理)
EventBus 实现领域事件(Domain Events)
模块以及模块的依赖关系实现插件化的模块处理等等
ABP 框架主要还是基于领域驱动的理念来构建整个架构的, 其中领域驱动包含的概念有 域对象 Entities, 仓储对象 Repositories, 域服务接口层 Domain Services, 域事件 Domain Events, 应用服务接口 Application Services, 数据传输对象 DTOs 等. 一般简化来说, 我们可以只需要保留域对象, 标准仓储对象(不用自定义仓储接口), 应用服务接口和 DTO 对象即可, 域服务层接口层和自定义的仓储对象一般情况下可以省略, 后面我会介绍这个内容, 也就是利用这些对象及关系, 快速构建一个易于使用的 ABP 框架分层.
ABP 官方网站: http://www.aspnetboilerplate.com, 从里面可以查看很详细的案例和文档说明, 可以根据需要下载不同类型的基础框架.
ABP GitHub 源码地址: https://github.com/aspnetboilerplate, 可以下载整个基础的框架内容, 以及相关的样板案例代码.
下面是一个比较直观的 ABP 框架分层架构图.
上图只是一个大概的介绍, 其实客户端部分, 还应该包括 Winform 客户端, 控制台客户端, WPF 客户端等内容, 而浏览器的前端 - Web 前端, 还可以包含使用 Ant-Design(React),IView(vue),Angular 等不同的前端技术来承载界面呈现层. 而底层的数据库支持, 还可以接入更多的, 包括 MS Sqlserver,Oracle,MySQL,PostgreSQL,SQLite 等数据库.
我们可以看到展现层, 应用层, 领域层, 持久化层等几个不同的分层, 每个分层似乎都很好, 但是可能需要落实到实处进行进一步的了解, 由于目前. net core 的技术应用逐渐走向主流, 我们就以它的. net core 方向进行介绍解读.
2) Web API 优先的架构
纵观整个 ABP 框架, 它的核心还是主要以 .NET 的后端技术为主线, 也是着重笔墨的部分, 在其展现层中, 虽然 ASP.NET MVC(包括. net Core 部分)和 Web API 作为两个部分, 但它的动态发布 Web API, 更为 Web API 优先的架构提供了很好的便利.
在当今流行的展现层中, 越来越不依赖于后端的技术实现, 而侧重于 Web API 标准化的对接, 基于 JSON 数据的交互处理. 不管是以 Ant-Design(React),IView(VUE),Angular 等技术应用的 Web 前端, 我们可以看到这些架构很容易实现对 Web API 的标准接口对接, 在我较早提供的 Winform 混合框架里面, 也是以 Web API 优先的策略进行云端应用的部署. 如下图是我在博客《Web API 应用架构设计分析(1)》,《Web API 应用架构设计分析(2)》,《Web API 接口设计经验总结》,《Winform 混合式开发框架访问 Web API 接口的处理》,《Web API 应用架构在 Winform 混合框架中的应用(3)--Winform 界面调用 WebAPI 的过程分解》等文章中的阐述.
作为 ABP 框架的核心, Web API 动态发布, 为其展现层提供了非常方便的途径, 使得我们可以在利用其强大的后端架构的基础上, 整合了很多. NET 的很多技术应用, 如前面介绍的很多 ABP 框架的特性.
前面介绍了基于 Web API 优先应用的特点, 可以为我们产品线的快速扩展提供了很好的技术支撑, 而 ABP 框架是一个比较强大, 健壮, 而且是集众多. NET 优秀技术应用的集大成者, 虽然整合使用 ABP 框架会比较一般的框架需要花费多一些时间, 不过在构建比较大型, 又需要强大的后台的需求下, 这种应用场景是非常不错的, 也是一个很好的投资.
3)ABP 框架的项目结构
ABP 框架, 包含了两个部分, 一个基础的 ABP 框架实现(地址), 这个是我们所说的 ABP 框架的核心实现;
一个是基于这个基础上扩展应用的 ABP 框架, 它整合了框架核心部分, 并提供了一些基础处理模块, 如人员, 角色, 权限, 会话, 身份验证, 多租户, 日志记录等等内容, 我们一般指的 ABP 框架应用就是这个基础上扩展自己的业务项目. 这个部分, 我们可以根据官网上进行一定的选项配置, 然后下载使用.
下载. net core 项目后, 其中后端部分的项目视图如下所示.
我们从这个项目里面可以看到, 它主要是分为下面几个项目分层.
Application 应用层: 应用层提供一些应用服务 (Application Services) 方法供展现层调用. 一个应用服务方法接收一个 DTO(数据传输对象)作为输入参数, 使用这个输入参数执行特定的领域层操作, 并根据需要可返回另一个 DTO.
Core 领域核心层, 领域层就是业务层, 是一个项目的核心, 所有业务规则都应该在领域层实现. 这个项目里面, 除了定义所需的领域实体类外, 其实可以定义我们自己的自定义的仓储对象(类似 DAL/IDAL), 以及定义自己的业务逻辑层(类似 BLL/IBLL), 以及基于 AutoMapper 映射规则等内容.
EntityFrameworkCore 实体框架核心层, 这个项目不需要修改太多内容, 只需要在 DbContext 里面加入对应领域对象的仓储对象即可.
Migrator 数据迁移层, 这个是一个辅助创建的控制台程序项目, 如果基于 DB First, 我们可以利用它来创建我们项目的初始化数据库.
Web.Core Web 核心层, 基于 Web 或者 Web API 的核心层, 提供了对身份登陆验证的基础处理, 没有其他内容.
Web.Core.Host Web API 的宿主层, 也是动态发布 Web API 的核心内容, 另外在 Web API 里面整合了 Swagger, 使得我们可以方便对 Web API 的接口进行调试.
Tests 单元测试层, 这个提供了一些应用层对象的模拟测试, 其中测试的数据库使用的是 Entity Framework 的内存数据库, 不影响实际数据库内容.
以上是 ABP 框架的总体情况, 我们到现在还没有正式深入介绍其中的各个部分, 以及如果对这些内容进行优化处理, 主要就是介绍一个整体性的 ABP 框架特性, 以及 ABP 框架侧重的 Web API 方向, 后续我继续对它进行深入的介绍和项目改造, 以便适应我们实际的 ABP 项目开发.
来源: https://www.cnblogs.com/wuhuacong/p/10919020.html