手工搭建ABP框架(1) - Web项目
为了防止不提供原网址的转载,特在这里加上原文链接:
http://www.cnblogs.com/skabyy/p/7295533.html
ABP是 ASP.NET Boilerplate Project 的简称。ABP是基于DDD(领域驱动设计)的框架。ABP包含众多组件,包括依赖注入、动态API、审计日志、权限控制等等。在大部分的ABP教材中,会推荐使用模板(https://aspnetboilerplate.com/Templates)来创建ABP工程。然而在实际使用中(至少在我的情况里)一般都需要手工搭建框架而非使用模板。手工搭建有下面几个好处:
- 模板创建的工程有很多不需要的东西需要调整或删除,手工搭建免去了这些麻烦;
- 手工搭建框架能更自由地根据实际需求进行自定义配置和扩展;
- 手工搭建能帮助你更深入地理解ABP框架。
由于手工搭建ABP框架材料较少,我搭建时踩了不少坑。所以在这里记录一下搭建框架的核心步骤,以免以后重新摸索,同时与大家分享,欢迎拍砖。下面我们以开发一个简单的微博应用为例来展示如何使用ABP框架。
新建VS项目
用VS新建Web MVC项目,项目名称为MyTweet.Web。同时新建解决方案,解决方案名称为MyTweet。要注意的一点是ABP只支持.NET 4.6以上版本,所以新建项目时记得选.NET Framework 4.6以上的版本。

接下来,我们遵循DDD的原则,新建以下几个层次的项目:
- 展现层(Presentation),负责用户界面与用户交互。在我们这个应用中,展现层是.NET MVC,包括Controller以及前端代码,实现在项目
MyTweet.Web中。 - 应用层(Application),负责展现层与领域层之间的协调。实现在项目
MyTweet.Application中。 - 领域层(Domain),负责业务对象与业务逻辑。实现在项目
MyTweet.Domain中。 - 基础设施层(Infrastructure),提供一些通用的方法。实现在项目
MyTweet.Infrastructure中。

新建好项目后,还需要设置引用依赖关系。在此不再赘述。
安装ABP相关的NuGet包
安装Abp包到所有项目。
安装Abp.Web.Mvc和Abp.Web.Api到MyTweet.Web。
使用的版本均为2.3.0
创建模块
ABP提供了模块系统。使用模块能方便地管理各个组件的初始化与依赖关系。一般来说,每个项目都会建一个模块。由于本篇只用到了MyTweet.Web和MyTweet.Application,所以先只新建这两个模块。
在MyTweet.Application目录下新建类MyTweetApplicationModule,并继承自AbpModule。如图:

模块中的Initialize方法定义了模块初始化时执行的操作。目前只做了IoC依赖注入的操作。
另外,在MyTweet.Web/App_Start目录下新建类MyTweetWebModule,同样也需要继承自AbpModule,并且,这个模块还需要依赖AbpWebApiModule(WebAPI需要这个模块),MyTweetApplicationModule。如图:

最后,为了让程序运行时能识别并执行模块,需要修改入口方法。.NET MVC的入口方法在Global.asax.cs文件中,如下图,MvcApplication修改为继承AbpWebApplication<MyTweetWebModule>,并相应地修改Application_Start方法。

WebAPI
我们使用WebAPI的方式定义前后端交互的接口。当然,直接使用MVC的方法也是可以的。这里只是单纯为了试用ABP动态WebAPI的用法而使用的WebAPI。
我们将实现两个接口:
GetTweets接口,GET方法,用于查询出所有微博。CreateTweet接口,POST方法,用于新增一条微博。
因为我们还没实现数据库访问功能,所以现在还不会真正实现这两个接口,这两个接口现在只让它们返回一些测试数据。
在ABP框架下实现WebAPI十分方便,ABP能够使用反射的方法自动从应用层AppService的public方法生成WebAPI接口。只需在MyTweetModule的初始化方法添加代码定义动态ApiController生成规则:

这些代码会在MyTweetApplicationModule的程序集中,将所有IApplicationService的实现类动态生成ApiController,并且根据方法名对public方法绑定相应的HTTP Method动词。
比如,GetTweets绑定为GET方法,PutTweet绑定为PUT方法,其他名称的方法像CreateTweet绑定为POST方法。
(这里有一个例外,Get开头的方法如果参数是一个object——一个DTO的话,那这个方法会被绑定为POST方法。)
生成的WebAPI接口的访问路径为/api/services/MyTweet/{AppSvcName}/{ActionName},其中{AppSvcName}是IApplicationService实现类的类名(去掉后缀AppService),{ActionName}是方法名。
接下来我们实现GetTweets和CreateTweet两个接口:


现在只是简单的让这两个接口随便返回一些结果。GetTweets是接收一个字符串参数的GET接口,CreateTweet是接收一个字符串s、一个整数s的POST接口(C#与JavaScript对大小写的编码规范不同是一件很烦人的事,幸好ABP框架做了自动转换)。这两个接口的路径分别为/api/services/MyTweet/MyTweet/GetTweets和/api/services/MyTweet/MyTweet/CreateTweet。
最后测试一下,运行MyTweet.Web项目,GET接口直接在浏览器就能访问:

POST接口可以用Postman工具来访问:

大功告成!
你访问API的时候可能会出现"Empty or invalid anti forgery header token"的错误,这是因为某些ABP版本默认开启了CSRF防御。在MyTweetWebModule的PreInitialize方法加上下面这行代码关闭CSRF防御就可以了。
Configuration.Modules.AbpWeb().AntiForgery.IsEnabled = false;
Abp Module
最后简要介绍下ABP的模块系统。更详细的讲解可查阅官网的文档https://aspnetboilerplate.com/Pages/Documents/Module-System。
模块主要用来管理系统初始化和关闭时要执行的操作。ABP在系统初始化和关闭时根据模块间依赖关系执行相应的操作。
定义一个模块只需要继承AbpModule。我们可以用DependsOn标签来声明模块间的依赖关系(ABP框架会自动解析依赖关系,但建议使用显式的声明)。
一个模块会有如下方法,我们可以重载这些方法来定义模块初始化/关闭时要做的操作:
PreInitialize:预初始化Initialize:初始化PostInitialize:后初始化Shutdown:关闭
应用启动时会根据模块的依赖顺序进行初始化。比如有模块A和模块B,模块A依赖模块B,那么初始化的执行顺序为:
- B的
PreInitialize - A的
PreInitialize - B的
Initialize - A的
Initialize - B的
PostInitialize - A的
PostInitialize
关闭则按照依赖相反顺序:
- A的
Shutdown - B的
Shutdown
最后还有一个问题:应用启动时,ABP框架如何知道要初始化哪些模块?答案在入口函数方法:

ABP框架解析MyTweetModule所依赖的模块,按顺序初始化这些模块(包括MyTweetModule)。
手工搭建ABP框架(1) - Web项目的更多相关文章
- ABP架构学习系列三:手工搭建ABP框架
由于公司的项目才接触到ABP这个框架,当时就觉得高大上,什么IOC.AOP.ddd各种专业词汇让人激情 澎湃,但在使用过程中碰到了许多坑,可能也许是没有去看源码导致的,但工作确实没有那么多时间让人去慢 ...
- 使用maven搭建ssm框架的javaweb项目
目前主流的javaweb项目,常会用到ssm(Spring+Spring MVC+Mybatis)框架来搭建项目的主体框架,本篇介绍搭建SSM框架的maven项目的实施流程.记之共享! 一.SSM框架 ...
- 手动从0搭建ABP框架-ABP官方完整解决方案和手动搭建简化解决方案实践
本文主要讲解了如何把ABP官方的在线生成解决方案运行起来,并说明了解决方案中项目间的依赖关系.然后手动实践了如何从0搭建了一个简化的解决方案.ABP官方的在线生成解决方案源码下载参考[3],手动搭 ...
- SSM框架开发web项目系列(二) MyBatis真正的力量
前言 上篇SSM框架环境搭建篇,演示了我们进行web开发必不可少的一些配置和准备工作,如果这方面还有疑问的地方,可以先参考上一篇“SSM框架开发web项目系列(一) 环境搭建篇”.本文主要介绍MyBa ...
- SSM框架开发web项目系列(三) MyBatis之resultMap及关联映射
前言 在上篇MyBatis基础篇中我们独立使用MyBatis构建了一个简单的数据库访问程序,可以实现单表的基本增删改查等操作,通过该实例我们可以初步了解MyBatis操作数据库需要的一些组成部分(配置 ...
- SSM框架开发web项目系列(五) Spring集成MyBatis
前言 在前面的MyBatis部分内容中,我们已经可以独立的基于MyBatis构建一个数据库访问层应用,但是在实际的项目开发中,我们的程序不会这么简单,层次也更加复杂,除了这里说到的持久层,还有业务逻辑 ...
- Springboot搭建SSM+JSP的web项目
Springboot搭建SSM+JSP的web项目 一:创建项目结构: 项目结构分为三个部分: 1 后端项目开发文件: 包: Util 工具包 Mapper db层 Serv ...
- 如何用ABP框架快速完成项目(面向项目交付编程面向客户编程篇)(1) - 目录
昨天发表了<如何用ABP框架快速完成项目 - 自动化测试 - 前端angular e2e protractor>后,大家十分热情,几个小时内就收到了不少问题,包括: 对于ui自动化测试这方 ...
- 如何用ABP框架快速完成项目 - 自动化测试 - 前端angular e2e protractor
要想快速完成一个项目, 自动化是很关键很有用的一块. 自动化测试比人工测试快很多. 特别是在回归测试中. 实践证明, 虽然投入了时间在写自动化测试代码上, 但是在回归测试中节省了大量的时间,同时及时发 ...
随机推荐
- AngularJS小结
1.简介 AngularJS 通过 ng-directives 扩展了 HTML. 2.AngularJS指令 ng-app 指令定义一个AngularJS 应用程序的根元素.指令在网页加载完毕时会自 ...
- [C#]关于DBNULL的解释
1 概述 如下例子,你觉得有什么问题?如你能很快的找出问题,并且解决它,那么你可以跳过本篇文章,谢谢~~. List<Base_Employee> ltPI = new List< ...
- MMORPG战斗系统随笔(一)
前言 很久没有更新博客,中间迁移过一次博客,后来一直忙于项目的开发,忙的晚上回去没时间写博客,周日又要自我调整一下,所以空闲了很久没有继续写博客.最近终于慢慢放慢节奏,项目也快上线了,可以有空写一些个 ...
- Spark官方1 ---------Spark SQL和DataFrame指南(1.5.0)
概述 Spark SQL是用于结构化数据处理的Spark模块.它提供了一个称为DataFrames的编程抽象,也可以作为分布式SQL查询引擎. Spark SQL也可用于从现有的Hive安装中读取数据 ...
- Hive基础(4)---Hive的内置服务
版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] 一:Hive的几种内置服务 ...
- 通过修改 LayoutInflater,全局替换字体!!!
序 在 Android 下使用自定义字体已经是一个比较常见的需求了,最近也做了个比较深入的研究. 那么按照惯例我又要出个一篇有关 Android 修改字体相关的文章,但是写下来发现内容还挺多的,所以我 ...
- FPGA与Deep Learning
你还没听过FPGA?那你一定是好久没有更新自己在IT领域的知识了. FPGA全称现场可编程门阵列(Field-Programmable Gate Array),最初作为专用集成电路领域中的一种半定制电 ...
- ZOJ1654 Place the Robots
Zoj1654 标准解法:二分匈牙利. 写法各异嘛,看不懂或者懒得看也正常,如果想了解我思路的可以和我讨论的. 在练习sap,所以还是写了一遍: #include<cstdio> #inc ...
- Jquery购物车jsorder改进版,支持后台处理程序直接转换成DataTable处理
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- SQL 2008 外网访问说明
1. 安装SQL2008 . 安装SQL2008之前,必须预先安装.NET Framework 3.5,和Windows Installer 4.5 Redistributable. 可能产生错误: ...