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 ...
随机推荐
- Linq表达式、Lambda表达式你更喜欢哪个?
什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...
- Git 在团队中的最佳实践--如何正确使用Git Flow
我们已经从SVN 切换到Git很多年了,现在几乎所有的项目都在使用Github管理, 本篇文章讲一下为什么使用Git, 以及如何在团队中正确使用. Git的优点 Git的优点很多,但是这里只列出我认为 ...
- win7安装时,避免产生100m系统保留分区的办法
在通过光盘或者U盘安装Win7操作系统时,在对新硬盘进行分区时,会自动产生100m的系统保留分区.对于有洁癖的人来说,这个不可见又删不掉的分区是个苦恼.下面介绍通过diskpart消灭保留分区的办法: ...
- 07.LoT.UI 前后台通用框架分解系列之——轻巧的文本编辑器
LoT.UI汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui 上次说的是强大的百度编辑器 http://www.cnblogs.com/d ...
- $.type 怎么精确判断对象类型的 --(源码学习2)
目标: var a = [1,2,3]; console.log(typeof a); //->object console.log($.type(a)); //->ar ...
- 80 端口被占用 pid=4
80端口被pid=4的系统进程给占用的解决方法: 一般开发的时候我们都会安装sqlserver ,也会把Sql server Reporting Services 安装上去.原因就是这个服务占用了80 ...
- redis集成到Springmvc中及使用实例
redis是现在主流的缓存工具了,因为使用简单.高效且对服务器要求较小,用于大数据量下的缓存 spring也提供了对redis的支持: org.springframework.data.redis.c ...
- 玩转spring boot——结合JPA入门
参考官方例子:https://spring.io/guides/gs/accessing-data-jpa/ 接着上篇内容 一.小试牛刀 创建maven项目后,修改pom.xml文件 <proj ...
- 3种web会话管理的方式
http是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的.当然它知道是哪个客户端地址发过来的,但是对于我们的应用来说,我们是靠用户来管理,而不是靠客户端. ...
- 纯javaScript、jQuery实现个性化图片轮播
纯javaScript实现个性化图片轮播 轮播原理说明<如上图所示>: 1. 画布部分(可视区域)属性说明:overflow:hidden使得超出画布部分隐藏或说不可见.position: ...