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 ...
随机推荐
- 黑云压城城欲摧 - 2016年iOS公开可利用漏洞总结
黑云压城城欲摧 - 2016年iOS公开可利用漏洞总结 作者:蒸米,耀刺,黑雪 @ Team OverSky 0x00 序 iOS的安全性远比大家的想象中脆弱,除了没有公开的漏洞以外,还有很多已经公开 ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- JavaScript中fn()和return fn()
看博客时,注意到return的重要性 参考:http://www.cnblogs.com/raoyunxiao/p/5644032.html 看似反常的例子: var i = 0; function ...
- JavaScript的继承实现方式
1.使用call或apply方法,将父对象的构造函数绑定在子对象上 function A(){ this.name = 'json'; } function B(){ A.call(this); } ...
- nodejs进阶(1)—输出hello world
下面将带领大家一步步学习nodejs,知道怎么使用nodejs搭建服务器,响应get/post请求,连接数据库等. 搭建服务器页面输出hello world var http = require ...
- 一篇文章看懂TPCx-BB(大数据基准测试工具)源码
TPCx-BB是大数据基准测试工具,它通过模拟零售商的30个应用场景,执行30个查询来衡量基于Hadoop的大数据系统的包括硬件和软件的性能.其中一些场景还用到了机器学习算法(聚类.线性回归等).为了 ...
- My TWI
前言 对TWI没有什么特别的印象,因为有一个更出名的TWU,而我去年又刚好错过了它,因此TWU的光辉完全掩盖了TWI.对TWI印象最深的是在邮件中看到的38th北京的这期,看到他们的图文记录,在圈子中 ...
- [原]HAproxy 代理技术原理探究
HAproxy 技术分享 简介 HAProxy是一款提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件 Features 1.免费 2.能够做到4层以上代理 3.高性能 ...
- [干货来袭]MSSQL Server on Linux预览版安装教程(先帮大家踩坑)
前言 昨天晚上微软爸爸开了全国开发者大会,会上的内容,我就不多说了,园子里面很多.. 我们唐总裁在今年曾今透漏过SQL Server love Linux,果不其然,这次开发者大会上就推出了MSSQL ...
- The Zen of Python
Beautiful is better than ugly. 优美总比丑陋好Explicit is better than implicit. 直率总比含蓄好Simple is better than ...