ABP框架 - 多层结构
本节内容:
一个应用的代码库的分层是一个广为接受的技术,用来减少复杂度和提高代码复用性。ABP依照DDD理念来分层,在DDD里有4个基本的层:
- 表示层:为用户提供一个界面。使用应用层来完成用户交互。
- 应用层:表示层与领域层的媒介。协调服务业对象执行指定的应用任务。
- 领域层:包含业务对象和业务规则。是整个应用的核心。
- 基础层:提供支持更高层的通用技术。一个基础层的典型例子是通过ORM框架实现与数据库的交互的仓储,或是实现发送邮件的邮件供应器。
也可以根据需要添加层,例如:
- 分布服务层:为远程客户端公开应用特性。像Asp.net web API和WCF等。
这些都是以领域为核心的架构的通用层。实现上可能有些细微的差别。
ABP架构
层和结构的概览如下:
Layers |
|
|---|---|
| Presentation | View Models (Javascript), Views (HTML/CSS), Localization, Navigation, Notifications |
| Web | Web API Controllers, MVC Controllers, OData, ASP.NET Core |
| Application | Application Services, DTOs, DTO Mappers, Authorization, Session, Audit Logging |
| Domain (Core) | Entities, Value Objects, Repositories, Domain Services, Unit of Work, Domain Events |
| Infrastructure | ORM (EntityFramework, NHibernate), DB Migrations, Background Jobs |
Others (common) |
|
下图为一个包含5个项目的简单分层应用:

一个层可以实现成一个或多个程序集。在大型项目里可能为第三方依赖创建多个程序集更合适(像此处的EntityFramework),使每个层都有它自己的Context。
领域(Core)层
领域层必须实现所有业务规则。
实体:展示数据和领域业务的操作。通常地它们映射到数据库表。
仓储:类似于对象集合,用来获取和持久化实体到数据源(数据库)。领域层定义了仓储,但不实现它们,由基础层来实现它们。
领域事件:定义领域里特定的事件,并触发和处理它们。领域服务利用实体(及其它领域对象)实现那些不属于某个单独实体的业务规则。
工作单元:是一个管理数据库连接和事务的设计模式,跟踪实体变化并保存变化到数据存储。领域层定义了它,但由基础层实现它。
这一层应该尽可能地独立于第三方类库。
应用层
应用层包含用于展示层的应用服务。一个应用服务方法可以接收一个DTO(数据传输对象)作为输入,使用这个输入执行一些领域层的操作,并在需要时返回另一个DTO。它不应该接收或返回实体。一个应用服务方法被认为是一个工作单元。用户输入验证也是在这一层实现。建议使用类似于AutoMapper库等工具来映射实体和DTO。这层还包含当前用户信息的会话(Session)。
基础层
当领域层定义仓储、工作单元、和其它服务接口后,基础层实现这些商品。用ORM工具(如NHibernate或EntityFramework)实现仓储。ABP已经这此二种ORM框架提供基类。基础层从其它层抽象出对第三方库的依赖。在这层里也可以使用数据迁移。
除了数据访问,我们可能需要为服务供应商进行抽象,例如,我可能使用服务供应商提供的服务发送短讯,我们可以在领域层或应用层定义一个接口来抽象它,然后我们在这层里实现它。
Web & 展示层
Web层用Asp.net、Web API和Asp.net Core实现。两种方式都可在单页面应用(SPA)或多页面应用(MPA)中实现,启动模板也都支持这两种方式。
在一个SPA里所有资源只加载一次(或预先加载核心资源然后在有需要时延迟加载其它资源)给客户端(浏览器),后续的与服务器的交互使用AJAX调用,从服务端获取数据后,Html代码在客户端创建。整个页面不再刷新,视图只是在需要时换出换入。现在有很多Javascript SPA框架,例如Angularjs,Backbonejs和Emberjs。ABP可以使用任何一种,但使用示例和一些帮助机制可能使用Angular更容易。
在一个MPA里,客户端发送一个请求到服务端,服务端代码(通常是Asp.net MVC控制器)从数据库获取数据,并Razor渲染视图创建HTML。创建之后的页面被发送回客户端显示。每个新页面会刷新整个页面。不过客户端也可以通过额外的AJAX请求来优化体验。
SPA和MPA涉及到完全不同的结构。一个管理面板的完美选择是SPA,另外方面,一个博客最好选择MPA,因为它更有利于被搜索引擎发现。即便如此,SPA也可以通过工具使得被搜索引擎发现。当然这些都只是通常做法。
SignalR是一个从服务端推送通知给客户端的完美工具。它能给用户带来丰富、实时的体验。
当下在客户端有许多Javascript类和框架。Jquery是最流行并拥有成千的免费插件。当然还有很多工具/框架使得它与HTML和CSS更好地合作。例如,推特的Bootstrap就是一个非常流行的HTML/CSS框架。
ABP提供基础服务,从你的应用服务自动创建一个Web API层,Javascript可以很容易地使用它们。另外,它提供基础服务来管理应用菜单、本地化和语言切换。同时包含一个简单但统一的Javascript API来简化系统信息和通知的显示。
ABP在服务端自动处理异常并返回一个对应的响应给客户端。
其它
ABP使用Castle Windsor框架支持依赖注入。同时使用Log4Net为客户端记录日志,然而,可以很方便地切换日志类库,只是利用Castle的抽象日志基础,而不需要改变代码。
总结
ABP协调一些最好的框架/类库与它自身的类和系统来提供一个更好的基础服务,方便使用多层结构创建一个Web应用。同时提供的模板更容易地为你的应用提供多层解决方案。
ABP框架 - 多层结构的更多相关文章
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- 一步一步使用ABP框架搭建正式项目系列教程
研究ABP框架好多天了,第一次看到这个框架的名称到现在已经很久了,但由于当时内功有限,看不太懂,所以就只是大概记住了ABP这个名字.最近几天,看到了园友@阳光铭睿的系列ABP教程,又点燃了我内心要研究 ...
- C#高级知识点&(ABP框架理论学习高级篇)——白金版
前言摘要 很早以前就有要写ABP高级系列教程的计划了,但是迟迟到现在这个高级理论系列才和大家见面.其实这篇博客很早就着手写了,只是楼主一直写写停停.看看下图,就知道这篇博客的生产日期了,谁知它的出厂日 ...
- 高薪诚聘熟悉ABP框架的.NET高级开发工程师(2016年7月28日重发)
招聘单位是ABP架构设计交流群(134710707)群主阳铭所在的公司-上海运图贸易有限公司 招聘岗位:.NET高级开发工程师工作地点:上海-普陀区 [公司情况]上海运图贸易有限公司,是由易迅网的创始 ...
- ABP框架实践基础篇之开发UI层
返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 说明 其实最开始写的,就是这个ABP框架实践基础篇.在写这篇博客之前,又回头复习了一下ABP框架的理论,如果你还没学习,请查看AB ...
- 一步一步使用ABP框架搭建正式项目系列教程之本地化详解
返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 本篇目录 扯扯本地化 ABP中的本地化 小结 扯扯本地化 本节来说说本地化,也有叫国际化.全球化的,不管怎么个叫法,反正道理都是一 ...
- ABP框架搭建项目系列教程基础版完结篇
返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 经过前面十二篇的基础教程,现在终于该做个总结了. 回顾 第一篇,我们建议新手朋友们先通过ABP官网的启动模板生成解决方案,因为这样 ...
- ABP框架 - 集成OWIN
文档目录 如果你在应用中同时使用Asp.net Mvc和Asp.net Web API,你需要在你的项目里添加Abp.Owin的nuget包(通常是Web项目)然后在你的OWIN的Startup文件里 ...
- ABP框架 - 功能管理
文档目录 本节内容: 简介 关于 IFeatureValueStore 功能类型 Boolean 功能 Value 功能 定义功能 基本功能属性 其它功能属性 功能层次 检查功能 使用Requires ...
随机推荐
- [BOT] 一种android中实现“圆角矩形”的方法
内容简介 文章介绍ImageView(方法也可以应用到其它View)圆角矩形(包括圆形)的一种实现方式,四个角可以分别指定为圆角.思路是利用"Xfermode + Path"来进行 ...
- Socket聊天程序——客户端
写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细 ...
- UITextView 输入字数限制
本文介绍了UITextView对中英文还有iOS自带表情输入的字数限制,由于中文输入会有联想导致字数限制不准确所以苦恼好久,所以参考一些大神的博客终于搞定,欢迎大家参考和指正. 对于限制UITextV ...
- Bootstrap-Select 动态加载数据的小记
关于前端框架系列的可以参考我我刚学Bootstrap时候写的LoT.UI http://www.cnblogs.com/dunitian/p/4822808.html#lotui bootstrap- ...
- 深入理解BFC
定义 在解释BFC之前,先说一下文档流.我们常说的文档流其实分为定位流.浮动流和普通流三种.而普通流其实就是指BFC中的FC.FC是formatting context的首字母缩写,直译过来是格式化上 ...
- SQL Server-聚焦IN VS EXISTS VS JOIN性能分析(十九)
前言 本节我们开始讲讲这一系列性能比较的终极篇IN VS EXISTS VS JOIN的性能分析,前面系列有人一直在说场景不够,这里我们结合查询索引列.非索引列.查询小表.查询大表来综合分析,简短的内 ...
- pandas基础-Python3
未完 for examples: example 1: # Code based on Python 3.x # _*_ coding: utf-8 _*_ # __Author: "LEM ...
- SSH免手动输入密码和设置代理
通过使用sshpass将密码写入命令里,直接执行,免去手动密码输入的步骤命令如下: sshpass -p password_abc ssh user_abc@ssh_host -p ssh_port ...
- 简单Linux命令学习笔记
1.查看进程 ps -ef | grep 关键字 /*关键字为服务名*/ netstat -unltp | grep 关键字 /*关键字为服务名或者是端口均可*/ 2.杀死进 ...
- 深入理解Spring MVC
如何让一个普通类成为Controller? 方案一:实现接口Controller 解析:handleRequest(request,response) 方案二:继承AbstractController ...