ABP-N层架构
ABP理论学习之N层架构
自从写这个系列博客之后,发现很多园友还是希望有个直接运行的demo,其实在github上就有官方的demo,我直接把这demo的链接放到这里吧,另外,我分析,这些找不到demo的同学,很可能是不怎么用github,可能的原因就是英文不好。所以还是希望程序员多看看英文文档,一开始看得很慢不要紧,时间久了,速度绝对能上去。因为都是技术性的文章,没有特别难的语法,能让大家退而却步的最多是些生词,这个就要靠大家积累常见的词汇了,一些生僻词的话查一下意思,理解了那句话就可以过了。
跟ABP相关的所有源码,包括zero,demo,都在这个目录下了,大家可以一个个点击看一下。下面做一稍微解释。
本篇目录
介绍
对应用代码基进行分层可以帮助降低复杂度和提高代码复用性,这已经成为广为接受的技巧。为了实现分层的架构,ABP遵循以下*DDD(领域驱动模型)的原则。在DDD中,有四个基础层:
- 表现层:用户访问的接口,使用应用层实现用户交互。
- 应用层:表现层和领域层之间的媒介。负责组织业务对象,以执行特定的应用任务。
- 领域层:包括业务对象和原则。这是应用的核心。
- 基础设施层:为支持更高层提供了广泛的技术能力。基础设施层的一个例子是仓储,它可以通过ORM框架和数据库进行交互。
也可能会加入额外必要的层。以下就是一个例子:
- 分布式服务层:将应用的功能暴露给远程客户端。可以提供这个层的工具包括Asp.Net Web API和WCF。
这些都是以领域为中心的架构的通用层次。基于实现的话,可能还会稍有不同。
ABP架构
层次和结构的概览如下图所示:
实际解决方案中的项目分层如下:
一层可以为一个或多个程序集。对于第三方依赖创建不止一个程序集可能会特别好(比如NHibernate)。
领域层
领域层是所有的业务规则实现的地方。
实体代表了业务领域的数据和操作。在实践中,它们一般会映射到数据库的表中。
仓储式跟集合很像的对象,使用仓储可以检索数据源(数据库)上的实体,并将实体持久化到数据源上。领域层只是定义了仓储,但是并没有实现它们,它们是在基础设施层实现的。
领域事件定义了领域特定的事件,也包括触发和处理这些事件。领域服务借助实体运行,并实现了不属于单个实体的业务规则。
工作单元是一种管理实体的设计模式,这些实体受业务逻辑影响,并将状态持久化到数据存储中。
领域层应该尽可能地独立于第三方的库。
应用层
应用层包含了展现层使用的应用服务。应用服务方法接收一个DTO(数据传输对象)作为输入参数,使用这个输入对象执行一些特定的领域层操作,然后,如果需要的话,可能返回另一个DTO。一般而言,应用服务方法不接收或者返回一个实体对象,这样做的好处就是可以允许展现层可以从领域层中将实体抽象出来,而不受实体的约束。一个应用服务方法一般被看作是一个工作单元。用户输入验证也是在这一层实现的。ABP提供了一个基础设施,因此可以很容易地实现验证。建议使用一个将实体映射为DTO的工具,比如AutoMapper,TinyMapper等。要学习AutoMapper的使用,请查看我的AutoMapper系列博客吧!
基础设施层
虽然领域层定义了仓储接口,但是基础设施层使用诸如NHibernate或者EntityFramework的ORM工具实现了那些仓储接口。ABP提供了使用这两种ORM框架的基类。基础设施层用于抽象来自其他层的第三方类库,数据库迁移(Database Migration)也可以用在这一层。
Web和展现层
Web层使用ASP.NET MVC和Web API实现的。这里可以使用两种不同的方式来实现:单页面应用和多页面应用。
在单页面应用中(SPA),所有的资源都会一次性加载到客户端(或者只加载核心资源,懒加载其他资源),所有的后续和服务器的交互都是通过Ajax调用。Html代码是使用从服务端接收到的数据在客户端生成的。整个页面不会刷新,视图只是在必要时换入换出。有许多的Javascript SPA框架,比如AngularJs,DurandalJs,BackboneJs和EmberJs。ABP可以使用它们中的任何一个,但是提供了使用 AngularJs和DurandalJs的样例。
在多页面(经典)应用中(MPA),客户端向服务端发送请求,服务端代码(ASP.NET MVC 控制器)从数据库中获取数据,然后Razor视图引擎生成html 代码。这些编译后的页面发回给客户端显示。每个新的页面都会导致完整页面的刷新。
SPA和MPA涉及了完全不同的架构。对于后台管理系统来说,SPA是最好的候选者,另一方面,博客更适合MPA模型,因为博客渴望被搜索引擎抓取数据。虽然有很多工具可以使SPA对于搜索引擎可见,但是目前的一般做法就是使用MPA。
SignalR是发送服务端到客户端的推送通知的最好工具,也可以给用户提供一个丰富而且实时的体验。
在客户端还有很多javascript库和框架。jQuery是这个领域最流行的,并伴有成千上万的插件。也有很多很容易就能使用Html和CSS的框架或工具。比如,Twitter Bootstrap是非常流行的HTML/CSS框架。
ABP提供了使用应用服务层自动创建Web API层的基础设施,使用Javascript可以轻松地调用Web API(看文档)。而且,还提供了管理管理应用菜单,本地化以及语言切换的基础设施,还包含了统一的Javascript API来简化显示系统的信息和通知。
ABP自动处理服务端的异常,并给客户端返回一个合适的响应。
其他
ABP通过Castle Windsor使用并支持依赖注入,也使用了Log4Net来记录服务端的日志,然而,通过使用Castle的日志设备无需改变代码就可以切换到其他的日志库。
总结
ABP平衡了一些最好的框架或者类库,除此之外,ABP自己的类和系统也提供了一个很好的用于N层架构Web应用构建的基础设施,也提供了很轻松地创建分层的解决方案的模板,用作应用的起点。
ABP-N层架构的更多相关文章
- ABP理论学习之N层架构
返回总目录 自从写这个系列博客之后,发现很多园友还是希望有个直接运行的demo,其实在github上就有官方的demo,我直接把这demo的链接放到这里吧,另外,我分析,这些找不到demo的同学,很可 ...
- [译]ABP框架使用AngularJs,ASP.NET MVC,Web API和EntityFramework构建N层架构的SPA应用程序
本文转自:http://www.skcode.cn/archives/281 本文演示ABP框架如何使用AngularJs,ASP.NET MVC,Web API 和EntityFramework构建 ...
- ABP官方文档翻译 1.2 N层架构
N层架构 介绍 ABP架构 其他(通用) 领域层 应用层 基础设施层 网络和展现层 其他 总结 介绍 应用程序代码库的分层架构是被广泛认可的可以减少程序复杂度.提高代码复用率的技术.为了实现分层架构, ...
- ABP(现代ASP.NET样板开发框架)系列之10、ABP领域层——实体
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之10.ABP领域层——实体 ABP是“ASP.NET Boilerplate Project (ASP.NET样板 ...
- ABP(现代ASP.NET样板开发框架)系列之11、ABP领域层——仓储(Repositories)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之11.ABP领域层——仓储(Repositories) ABP是“ASP.NET Boilerplate Proj ...
- ABP(现代ASP.NET样板开发框架)系列之12、ABP领域层——工作单元(Unit Of work)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之12.ABP领域层——工作单元(Unit Of work) ABP是“ASP.NET Boilerplate Pr ...
- ABP(现代ASP.NET样板开发框架)系列之13、ABP领域层——数据过滤器(Data filters)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之13.ABP领域层——数据过滤器(Data filters) ABP是“ASP.NET Boilerplate P ...
- ABP(现代ASP.NET样板开发框架)系列之14、ABP领域层——领域事件(Domain events)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之14.ABP领域层——领域事件(Domain events) ABP是“ASP.NET Boilerplate P ...
- ABP(现代ASP.NET样板开发框架)系列之20、ABP展现层——动态生成WebApi
点这里进入ABP系列文章总目录 ABP(现代ASP.NET样板开发框架)系列之20.ABP展现层——动态生成WebApi ABP是“ASP.NET Boilerplate Project (ASP.N ...
- ABP(现代ASP.NET样板开发框架)系列之21、ABP展现层——Javascript函数库
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之21.ABP展现层——Javascript函数库 ABP是“ASP.NET Boilerplate Project ...
随机推荐
- ThinkPHP---RBAC
一.什么是RBAC 基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注. 在RBAC中,权限与角色相关联,用户通 ...
- TkinterGUI - 初识Tkinter
前言 近期有写一个简单GUI程序的点子,具体写什么就不说了,但一个要求就是有跨平台的功能. 确切的讲,是我希望这个程序写好后能同时在Windows和Linux下运行,而且要方便随时修改. 对于编程语言 ...
- Android OpenGL ES 应用(二) 纹理
上一篇讲了基础入门 OpenGL (一) ,这一次主要学习OpenGL 纹理基本学习总结 要是做复杂的OpenGL应用程序,一定会用到纹理技术.纹理说白了就是把图片或者视频图像绘制到OpenGL空间中 ...
- SWT中的多线程(Invalid thread access)
最近在学习swt的东西,遇到一个问题,特转录如下. SWT异常: org.eclipse.swt.SWTException: Invalid thread access 在创建SWT界面的线程之外的线 ...
- hdu4586(概率、期望)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4586 题意:有一个色子,n面,每面有个分值a[i],其中有m面比较特殊,当该面出现时,可以再投一次.求 ...
- Beijing Perl Workshop - Augest 10th, 2013
Beijing Perl Workshop - Augest 10th, 2013 Beijing Perl Workshop
- MVAPI第一个版本架构图
MVAPI采用矢量与栅格结合的方式进行移动地图的显示. 进过几个月,目前终于可以完成基本的地图显示及操作功能.还有待实现的是各种性能及效果优化.3D地物等. 发一个1.0的架构图留存一下.(虽然目前还 ...
- C#文件操作基础之File类和FileInfo类
文件和I/O流的差异: 文件是一些具有永久存储及特定顺序的字节组成的一个有序的.具有名称的集合. 因此对于文件,我们经常想到文件夹路径,磁盘存储,文件和文件夹名等方面. I/O流提供一种后备存储写入字 ...
- 【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】
传送门:pid=4888">[HDU]4888 Redraw Beautiful Drawings 题目分析: 比赛的时候看出是个网络流,可是没有敲出来.各种反面样例推倒自己(究其原因 ...
- 《Cocos2d-x实战(卷Ⅰ):C++开发》
<Cocos2d-x实战(卷Ⅰ):C++开发> 基础篇 第1章 准备开始 1.1 本书学习路线图 1.2 使用实例代码 第2章 Cocos2d-x介绍与环境搭建 ...