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 ...
随机推荐
- poj3678(two-sat)
传送门:Katu Puzzl 题意:n个点,点的取值可以是0或者1.m条边,有权值,有运算方式(并,或,异或),要求和这条边相连的两个点经过边上的运算后的结果是边的权值.问你有没有可能把每个点赋值满足 ...
- HDU 3639 Hawk-and-Chicken(良好的沟通)
HDU 3639 Hawk-and-Chicken 题目链接 题意:就是在一个有向图上,满足传递关系,比方a->b, b->c,那么c能够得到2的支持,问得到支持最大的是谁,而且输出这些人 ...
- 【译】ASP.NET MVC 5 教程 - 8:搜索查询
原文:[译]ASP.NET MVC 5 教程 - 8:搜索查询 添加一个搜索的方法和搜索的视图 在本节中,我们为 Index 方法添加查询功能,使我们能够根据电影的题材或名称进行查找. 修改 Inde ...
- java设计模式_单例
public class Singleton { public static void main(String[] args) throws Exception { System.out.printl ...
- Knockout应用开发指南 第九章:高级应用举例
原文:Knockout应用开发指南 第九章:高级应用举例 1 Contacts editor 这个例子和微软为演示jQuery Data Linking Proposal例子提供的例子一样的提供的 ...
- Learning Cocos2d-x for WP8(8)——动作Action
原文:Learning Cocos2d-x for WP8(8)--动作Action 游戏很大程度上是由动作画面支撑起来的. 动作分为两大类:瞬间动作和延时动作. 瞬间动作基本等同于设置节点的属性,延 ...
- Hibernate常用Annotation标签说明
@ javax.persistence.Entity 实体类定义,该标签表示当前类是一个Hibernate的数据库实体,对应着数据库中的某个表 位置:用于类级别 参数:无 样例:@Entity 注意: ...
- hdu5618 (三维偏序,cdq分治)
给定空间中的n个点,问每个点有多少个点小于等于自己. 先来分析简单的二维的情况,那么只要将x坐标排序,那么这样的问题就可以划分为两个子问题,,这样的分治有一个特点,即前一个子问题的解决是独立的,而后一 ...
- shell统计
for i in `ls -r *_*.csv`;do cat $i|echo $i": "`wc -l`;done>tongji.txt
- JVM最多支持多少个线程?
JVM最多支持多少个线程? McGovernTheory在StackOverflow提了这样一个问题: Java虚拟机最多支持多少个线程?跟虚拟机开发商有关么?跟操作系统呢?还有其他的因素吗? Edd ...