3

基于ABP开发框架的技术点分析和项目快速开发实现

 2 years ago
source link: https://www.cnblogs.com/wuhuacong/p/15539145.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在我们开发各种项目应用的时候,往往都是基于一定框架进行,同时配合专用的代码生成工具,都是为了快速按照固定模式开发项目,事半功倍,本篇随笔对基于ABP开发框架的技术点进行分析和ABP框架项目快速开发实现进行介绍,抛砖引玉的对我们技术人员的日常技术工作进行一定的总结,希望大家不吝支持。

1、ABP开发框架的项目开发

下面对ABP框架的数据库支持、管理端界面、功能模块划分、ABP框架特点、模块开发支持等方面进行介绍,如下图所示。

我们知道,一般我们开发某个项目的时候,往往都会关注项目默认支持的数据库,以及后续能够支持的一些数据库,对于一般的应用,当然是希望它能够支持多种数据库。

对于ABP框架来说,它的底层是基于.netcore的Entity Framework Core ,它对于常规的数据库基本上都是支持的,如下所示。

 关于ABP框架使用Oracle数据库及数据库的迁移,可以参考我的随笔《ABP框架使用Oracle数据库,并实现从SQLServer中进行数据迁移的处理

 关于ABP框架使用Mysql数据库及数据库的迁移,可以参考我的随笔《ABP框架使用Mysql数据库,以及基于SQLServer创建Mysql数据库的架构和数据

现在框架基本上都是多端应用的了,所以在ABP框架中整合Winform管理端、Vue&element的BS前端,以及公司动态网站用于发布产品和网站信息等都是常见的应用,有时候,我们还需要根据功能的需要,增加一些小程序的支持,这些对于Web API后端来说,都是很容易接入的应用处理。

Winform应用端,其实很多时候是很必要的,提供众多丰富的功能展示,以及很好的用户交互能力,特别在对接硬件或者打印处理的时候。

和我们的Winform框架一样,Winform应用端提供封装良好的框架组件模块,包括权限系统、字典模块、附件管理模块、自动升级、分页控件、公用类库及界面基类模块等模块。 

而基于Vue + Element 的前端界面,和基于Winform的ABP框架一样,使用同一个API后端,模块包括用户管理、组织机构管理、角色管理、菜单管理、功能管理及权限分配,日志管理、字典管理、产品管理等管理功能,可实现用户的功能及数据权限进行控制管理。

公司动态门户网站,有时候用于我们发布网站信息和产品信息的一个门户网站,采用了Bootstrap-Vue界面组件,由于大多数门户网站都是基于Bootstrap栅格系统的,因此基于最新Bootstrap-Vue界面组件也就是最佳选择的了,而且可以重用很多Bootstrap的网站模板案例。这样也同时保持了前端模块同时也是基于Vue的,摒弃了以前基于JQuery的繁琐操作DOM处理。

有了这些管理端,基本上也就满足了大部分的需求,不过由于现在微信小程序的广泛应用,有时候我们针对一些业务模块功能,可以根据需要推出一些小程序应用场景,这些对接我们的统一授权系统,以及统一的WebAPI调用机制即可满足。

前面介绍了,基于ABP开发框架的Winform端、Vue&Element前端,都整合了很多常规的模块,如权限、字典、附件等常见的模块,这些既可以是系统性的管理模块,也是基础性数据的支撑,同时也会提供众多组件给我们应用模块进行使用的。

而我们在框架提供这些内容外,都需要根据具体业务的需要,按照框架的架构、编码标准要求,增量式的开发一些业务模块界面,一般最好的清空下是借助辅助工具的使用,能够节省大量的时间,同时降低难度,事半功倍。

2、ABP框架的代码生成

借助我们ABP框架的定制代码生成工具Database2sharp,可以对Winform界面开发、Vue&Element界面开发、ABP框架后端代码进行全栈式的开发处理。

 Database2sharp它通过整合框架相关的生成规则,我们可以增加对应的ABP框架后端代码的生成,如下代码生成工具界面所示。

Database2Sharp关于ABP框架的Winform界面配置如下界面所示,可以定制化的生成Winform界面代码。

在代码生成工具Database2Sharp界面里面,选择【代码生成】【ABP的Vue+Element界面代码】,如下所示。

确认生成代码后,我们可以看到对应的API调用JS类和Vue视图文件,如下所示。

3、ABP框架的特点

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层使用。

一般来说,对于数据库的操作,用标准仓储模式处理就可以了,而且我们基于框架的基类封装,可以减少很多标准的处理代码,只需要简单继承一下关系即可。

其中基类MyAsyncServiceBase 已经封装了常见的数据库操作处理。

而这个MyAsyncServiceBase 构造函数包含了相关的DTO对象,方便用于整个对象接口的处理,如查询条件、返回对象DTO、领域对象、主键类型等等。

如果不需要其他业务对象的操作,那么就保留默认的仓储对象即可,如果需要使用其他业务对象处理,那么同时引入,并在构造函数中注入所需的仓储对象,如下面所示。

 一般来说,这些集成关系,我们在利用代码生成工具生成代码的时候,都已经完全处理好的了,各层的关系也都一一生成。

它主要是分为下面几个项目分层。

Core领域核心层,领域层就是业务层,是一个项目的核心,所有业务规则都应该在领域层实现。这个项目里面,除了定义所需的领域实体类外,其实可以定义我们自己的自定义的仓储对象(类似DAL/IDAL),以及定义自己的业务逻辑层(类似BLL/IBLL),以及基于AutoMapper映射规则等内容。

EntityFrameworkCore 实体框架核心层,这个项目不需要修改太多内容,只需要在DbContext里面加入对应领域对象的仓储对象即可。

Application.Common和Application应用层:应用层提供一些应用服务(Application Services)方法供展现层调用。一个应用服务方法接收一个DTO(数据传输对象)作为输入参数,使用这个输入参数执行特定的领域层操作,并根据需要可返回另一个DTO。

Web.Core Web核心层,基于Web或者Web API的核心层,提供了对身份登陆验证的基础处理,没有其他内容。

Web.Core.Host Web API的宿主层,也是动态发布Web API的核心内容,另外在Web API里面整合了Swagger,使得我们可以方便对Web API的接口进行调试。

Migrator数据迁移层,这个是一个辅助创建的控制台程序项目,如果基于DB First,我们可以利用它来创建我们项目的初始化数据库。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK