文档目录

本节内容:


简介

一个应用的代码库的分层是一个广为接受的技术,用来减少复杂度和提高代码复用性。ABP依照DDD理念来分层,在DDD里有4个基本的层:

  • 表示层:为用户提供一个界面。使用应用层来完成用户交互。
  • 应用层:表示层与领域层的媒介。协调服务业对象执行指定的应用任务。
  • 领域层:包含业务对象和业务规则。是整个应用的核心。
  • 基础层:提供支持更高层的通用技术。一个基础层的典型例子是通过ORM框架实现与数据库的交互的仓储,或是实现发送邮件的邮件供应器。

也可以根据需要添加层,例如:

  • 分布服务层:为远程客户端公开应用特性。像Asp.net web API和WCF等。

这些都是以领域为核心的架构的通用层。实现上可能有些细微的差别。

ABP架构

层和结构的概览如下:

Layers

Presentation View Models (Javascript), Views (HTML/CSS), LocalizationNavigationNotifications
Web Web API ControllersMVC ControllersODataASP.NET Core
Application Application ServicesDTOsDTO Mappers, AuthorizationSessionAudit Logging
Domain (Core) Entities, Value Objects, RepositoriesDomain ServicesUnit of WorkDomain Events
Infrastructure ORM (EntityFrameworkNHibernate), 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框架 - 多层结构的更多相关文章

  1. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  2. 一步一步使用ABP框架搭建正式项目系列教程

    研究ABP框架好多天了,第一次看到这个框架的名称到现在已经很久了,但由于当时内功有限,看不太懂,所以就只是大概记住了ABP这个名字.最近几天,看到了园友@阳光铭睿的系列ABP教程,又点燃了我内心要研究 ...

  3. C#高级知识点&(ABP框架理论学习高级篇)——白金版

    前言摘要 很早以前就有要写ABP高级系列教程的计划了,但是迟迟到现在这个高级理论系列才和大家见面.其实这篇博客很早就着手写了,只是楼主一直写写停停.看看下图,就知道这篇博客的生产日期了,谁知它的出厂日 ...

  4. 高薪诚聘熟悉ABP框架的.NET高级开发工程师(2016年7月28日重发)

    招聘单位是ABP架构设计交流群(134710707)群主阳铭所在的公司-上海运图贸易有限公司 招聘岗位:.NET高级开发工程师工作地点:上海-普陀区 [公司情况]上海运图贸易有限公司,是由易迅网的创始 ...

  5. ABP框架实践基础篇之开发UI层

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 说明 其实最开始写的,就是这个ABP框架实践基础篇.在写这篇博客之前,又回头复习了一下ABP框架的理论,如果你还没学习,请查看AB ...

  6. 一步一步使用ABP框架搭建正式项目系列教程之本地化详解

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 本篇目录 扯扯本地化 ABP中的本地化 小结 扯扯本地化 本节来说说本地化,也有叫国际化.全球化的,不管怎么个叫法,反正道理都是一 ...

  7. ABP框架搭建项目系列教程基础版完结篇

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 经过前面十二篇的基础教程,现在终于该做个总结了. 回顾 第一篇,我们建议新手朋友们先通过ABP官网的启动模板生成解决方案,因为这样 ...

  8. ABP框架 - 集成OWIN

    文档目录 如果你在应用中同时使用Asp.net Mvc和Asp.net Web API,你需要在你的项目里添加Abp.Owin的nuget包(通常是Web项目)然后在你的OWIN的Startup文件里 ...

  9. ABP框架 - 功能管理

    文档目录 本节内容: 简介 关于 IFeatureValueStore 功能类型 Boolean 功能 Value 功能 定义功能 基本功能属性 其它功能属性 功能层次 检查功能 使用Requires ...

随机推荐

  1. Android性能优化之利用LeakCanary检测内存泄漏及解决办法

    前言: 最近公司C轮融资成功了,移动团队准备扩大一下,需要招聘Android开发工程师,陆陆续续面试了几位Android应聘者,面试过程中聊到性能优化中如何避免内存泄漏问题时,很少有人全面的回答上来. ...

  2. 关于VS2015 ASP.NET MVC添加控制器的时候报错

    调试环境:VS2015 数据库Mysql  WIN10 在调试过程中出现类似下两图的同学们,注意啦. 其实也是在学习的过程中遇到这个问题的,找了很多资料都没有正面的解决添加控制器的时候报错的问题,还是 ...

  3. linux centos中添加删除修改环境变量,设置java环境变量

    前言 安装完软件必要添加环境变量.指令很少,然而长时间不写就会不自信:我写的对吗?于是百度开始,于是发现又是各有千秋.好吧,好记星不如烂笔头.当然,最重要的是,百度出来的都他妈的是如何添加环境变量,只 ...

  4. jquery.cookie的使用

    今天想到了要为自己的影像日记增加赞的功能,并且需要用到cookie. 记得原生的js操作cookie也不是很麻烦的,但似乎jquery更简单,不过相比原生js,需要额外引入2个文件,似乎又不是很好,但 ...

  5. .Net语言 APP开发平台——Smobiler学习日志:如何快速在手机上实现ContextMenu

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的&qu ...

  6. 易用BPM时代,软件开发者缘何选择H3?

    近年来,企业级软件开发市场暗流汹涌,呈现出多种态势.软件开发团队规模趋于小型化,工作方式趋于快捷化,超过半数的软件开发者在工作中会选择使用易用的软件开发工具.随着流程管理越来越受到企业的重视,流程开发 ...

  7. HashMap的工作原理

    HashMap的工作原理   HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间 ...

  8. linux下 lvm 磁盘扩容

    打算给系统装一个oracle,发现磁盘空间不足.在安装系统的时候我选择的是自动分区,系统就会自动以LVM的方式分区.为了保证系统后期的可用性,建议所有新系统安装都采用LVM,之后生产上的设备我也打算这 ...

  9. 技术笔记:Indy的TIdSMTP改造,解决发送Html和主题截断问题

    使用Indy来发邮件坑不少啊,只不过有比没有好吧,使用delphi6这种老工具没办法,只能使用了新一点的Indy版本9,公司限制... 1.邮件包含TIdText和TIdAttachment时会出现T ...

  10. 在 Linux 上使用 Jexus + Mono 建立 Asp.Net 网站.

    godaddy 买了个net空间,一点也不好用. 几个G的数据, 上传数据只有几kb , 想用 ssh 登录上去用 wget 下载,也不行 windows的主机貌似没有 ssh 功能... 后来实在忍 ...