为了防止不提供原网址的转载,特在这里加上原文链接:
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框架。
用VS新建web MVC项目,项目名称为
。同时新建解决方案,解决方案名称为
- MyTweet.Web
。要注意的一点是ABP只支持.NET 4.6以上版本,所以新建项目时记得选.NET Framework 4.6以上的版本。
- MyTweet
接下来,我们遵循DDD的原则,新建以下几个层次的项目:
中。
- MyTweet.Web
中。
- MyTweet.Application
中。
- MyTweet.Domain
中。
- MyTweet.Infrastructure
新建好项目后,还需要设置引用依赖关系。在此不再赘述。
安装
包到所有项目。
- Abp
安装
和
- Abp.Web.Mvc
到
- Abp.Web.Api
。
- MyTweet.Web
ABP提供了模块系统。使用模块能方便地管理各个组件的初始化与依赖关系。一般来说,每个项目都会建一个模块。由于本篇只用到了
和
- MyTweet.Web
,所以先只新建这两个模块。
- MyTweet.Application
在
目录下新建类
- MyTweet.Application
,并继承自
- MyTweetApplicationModule
。如图:
- AbpModule
模块中的
方法定义了模块初始化时执行的操作。目前只做了IoC依赖注入的操作。
- Initialize
另外,在
目录下新建类
- MyTweet.Web/App_Start
,同样也需要继承自
- MyTweetWebModule
,并且,这个模块还需要依赖
- AbpModule
(WebAPI需要这个模块),
- AbpWebApiModule
。如图:
- MyTweetApplicationModule
最后,为了让程序运行时能识别并执行模块,需要修改入口方法。.NET MVC的入口方法在
文件中,如下图,
- Global.asax.cs
修改为继承
- MvcApplication
,并相应地修改
- AbpWebApplication<MyTweetWebModule>
方法。
- Application_Start
我们使用WebAPI的方式定义前后端交互的接口。当然,直接使用MVC的方法也是可以的。这里只是单纯为了试用ABP动态WebAPI的用法而使用的WebAPI。
我们将实现两个接口:
接口,GET方法,用于查询出所有微博。
- GetTweets
接口,POST方法,用于新增一条微博。
- CreateTweet
因为我们还没实现数据库访问功能,所以现在还不会真正实现这两个接口,这两个接口现在只让它们返回一些测试数据。
在ABP框架下实现WebAPI十分方便,ABP能够使用反射的方法自动从应用层
的public方法生成WebAPI接口。只需在
- AppService
的初始化方法添加代码定义动态
- MyTweetModule
生成规则:
- ApiController
这些代码会在
的程序集中,将所有
- MyTweetApplicationModule
的实现类动态生成
- IApplicationService
,并且根据方法名对public方法绑定相应的HTTP Method动词。 比如,
- ApiController
绑定为GET方法,
- GetTweets
绑定为PUT方法,其他名称的方法像
- PutTweet
绑定为POST方法。 (这里有一个例外,Get开头的方法如果参数是一个object——一个DTO的话,那这个方法会被绑定为POST方法。)
- CreateTweet
,其中
- /api/services/MyTweet/{AppSvcName}/{ActionName}
是
- {AppSvcName}
实现类的类名(去掉后缀
- IApplicationService
),
- AppService
是方法名。
- {ActionName}
接下来我们实现
和
- GetTweets
两个接口:
- CreateTweet
现在只是简单的让这两个接口随便返回一些结果。
是接收一个字符串参数的GET接口,
- GetTweets
是接收一个字符串
- CreateTweet
、一个整数
- s
的POST接口(C#与JavaScript对大小写的编码规范不同是一件很烦人的事,幸好ABP框架做了自动转换)。这两个接口的路径分别为
- s
和
- /api/services/MyTweet/MyTweet/GetTweets
。
- /api/services/MyTweet/MyTweet/CreateTweet
最后测试一下,运行
项目,GET接口直接在浏览器就能访问:
- MyTweet.Web
POST接口可以用Postman工具来访问:
大功告成!
你访问API的时候可能会出现"Empty or invalid anti forgery header token"的错误,这是因为某些ABP版本默认开启了CSRF防御。在
的
- MyTweetWebModule
方法加上下面这行代码关闭CSRF防御就可以了。
- PreInitialize
- Configuration.Modules.AbpWeb().AntiForgery.IsEnabled = false;
最后简要介绍下ABP的模块系统。更详细的讲解可查阅官网的文档https://aspnetboilerplate.com/Pages/Documents/Module-System。
模块主要用来管理系统初始化和关闭时要执行的操作。ABP在系统初始化和关闭时根据模块间依赖关系执行相应的操作。
定义一个模块只需要继承
。我们可以用
- AbpModule
标签来声明模块间的依赖关系(ABP框架会自动解析依赖关系,但建议使用显式的声明)。
- DependsOn
一个模块会有如下方法,我们可以重载这些方法来定义模块初始化/关闭时要做的操作:
:预初始化
- PreInitialize
:初始化
- Initialize
:后初始化
- PostInitialize
:关闭
- Shutdown
应用启动时会根据模块的依赖顺序进行初始化。比如有模块A和模块B,模块A依赖模块B,那么初始化的执行顺序为:
- PreInitialize
- PreInitialize
- Initialize
- Initialize
- PostInitialize
- PostInitialize
关闭则按照依赖相反顺序:
- Shutdown
- Shutdown
最后还有一个问题:应用启动时,ABP框架如何知道要初始化哪些模块?答案在入口函数方法:
ABP框架解析
所依赖的模块,按顺序初始化这些模块(包括
- MyTweetModule
)。
- MyTweetModule
来源: http://www.cnblogs.com/skabyy/p/7295533.html