N层架构

介绍

  应用程序代码库的分层架构是被广泛认可的可以减少程序复杂度、提高代码复用率的技术。为了实现分层架构,ABP遵循领域驱动设计的原则。在领域驱动设计中有四个基本层:

  • 表现层:提供用户接口。使用应用层实现用户交互。
  • 应用层:桥接表现层和领域层。协调业务对象来执行特定的应用任务。
  • 领域层:包括业务对象以及业务规则。此层是整个应用的核心。
  • 基础设施层:提供通用的技术能力来支持高层。基础设施层可以是使用ORM框架与数据库进行交互的一个仓储实现,或者是一个发送邮件的邮件提供商的实现。

  可能还会有按需添加的额外的层,如下:

  • 分布式服务层:将应用程序的特征暴露给远程客户端。像ASP.NET Web API、WCF这样的工具可以实现本层。

  这些就是以领域驱动为中心架构的所有通用层。基于不用的实现可能会有微小的差别。

ASP.NET Boilerplate 架构

  层级结构如下所示:

  

  下面一个简单的分层应用,一个有5个工程的解决方案:

  

  一个层可以有一个或多个程序集实现。对于大工程,最好为第三方依赖(如EntityFramework)创建多个项目。而且,可以有限界上下文,在这里每个上下文都有它自己的层。

领域层

  所有的业务规则都应在领域层实现。

  实体展现业务领域的数据和操作,通常来说实体会映射到实际的数据库表。

  仓储是收集对象的地方,用来提取或持久化数据源(如数据库)上的实体。领域层定义仓储但是没有实现。他们在基础设施层实现。

  领域事件用来定义特定的领域事件同时触发并处理他们。领域服务使用实体(和其他的领域对象)工作用来实现不属于一个实体的业务规则。

  工作单元是一个设计模式用来管理数据库连接和事务,跟踪实体变化并且保存改变到数据存储区。它定义在领域层,在基础设施层实现。

  此层应该尽可能的独立于第三方类库。

应用层

  应用层包含应用服务,应用服务被展示层使用。应用服务方法可以接收DTO(数据传输对象)作为输入,执行一些特定的领域层操作,如果需要,也可以返回另一个DTO。应用服务方法不应直接接收或返回实体。应用服务方法通常被认为是一个工作单元。用户输入验证也在本层实现。建议使用工具类映射实体到DTO对象,如AutoMapper类库。我们也在本层建立会话,并获取当前用户信息。

基础设施层

  领域层创建仓储、工作单元和其他服务的接口,基础设施层则实现这些接口。使用ORM工具如NHibernate或EntityFramework来实现仓库。APS.NET Boilerplate提供基础类来协作这两个ORM框架。基础设施层用来把其他层把对第三方库的依赖抽象出来。数据库迁移也可以在本层使用。

  除了数据库访问,还有对服务提供者的抽象。例如,可以有一个发送SMS消息的提供者。可以在领域层或应用层定义一个接口以便从我们的代码中抽象出来,然后我们可以在基础设施层实现这个接口。

网络、展示层

  网络层使用ASP.NET MVC、Web API和ASP.NET Core实现。有两种不同的方法可以在这里实现:单页面应用和多页面应用。启动模板里支持这两种方式。

  在单页面应用里,所有的资源都是一次(或者核心资源加载,其他资源是懒加载的)加载到客户端的,其他的子请求都是用过AJAX调用实现的。客户端使用从服务器接收的数据生成HTML代码。整个页面从不会刷新,视图根据需要换入或换出。有很多的Javascript SPA框架,如Angularjs,Backbonejs和Emberjs。ASP.NET Boierplate  可以和任何一个协作,但是ABP提供了例子和一些帮助机制能够更加容易的和Angular协作。

  在多页面应用里,客户端创建请求到服务端,服务端代码(通常是ASP.NET MVC 控制器)从数据库获取数据,Razor视图生成HTML。这些生成的页面返回给客户端显示。每一个新的页面请求都会导致整个页面刷新。客户端可以创建额外的AJAX请求以便有更好的用户体验。

  SPA和MPA包含完全不同的架构。管理面板适合SPA,博客MPA更合适,因为博客希望被搜索引擎搜索到。有工具可以是SPA应用对搜索引擎可见, 通常的做法是这样的。

  SignalR是从服务端推送消息到客户端的完美工具。它可以实现一个丰富的、即时的用户体验。

  客户端有许多的Javascript类库和框架。在数千万的免费插件中,jQuery是最流行的。同样有工具或类库可以更好的使用HTML和CSS。例如Twitter Bootstrap就是一个非常流行HTML/CSS框架。

  ABP提供了基础设施能够从应用服务创建Web API层,并且很容易使用JavaScript访问(参见文档)。另外,提供了管理应用菜单、本地化和语言切换的基础设施,还包含一个简单、统一的Javascript API简化显示系统消息和通知。

  ASP.NET Boilerplate自动在服务端处理异常并返回客户端一个前档的响应。

其他

  ASP.NET通过Castle Windsor框架使用和支持依赖注入。使用Log4Net记录服务端的日志,在castle抽象日志设施的帮助下可以在不改变代码的情况下轻松更换为其他日志记录类库。

总结

  ASP.NET Boilerplate除了利用它自己的类库和系统外还使用了其他一些最好的框架/类库提供了一个创建N层架构应用的伟大基础设施。它还有可以轻松创建分层解决方案的模板,以此可以作为我们应用的起点。

返回主目录

1.2 N层架构的更多相关文章

  1. MVC5 网站开发之五 展示层架构

    展示层由Ninesky.Web项目实现,负责网站内容的显示,项目包含Member和Control两个区域.   目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项 ...

  2. ABP理论学习之N层架构

    返回总目录 自从写这个系列博客之后,发现很多园友还是希望有个直接运行的demo,其实在github上就有官方的demo,我直接把这demo的链接放到这里吧,另外,我分析,这些找不到demo的同学,很可 ...

  3. 回头再看N层架构(图解)

    不知不觉来博客园已经快两半了,时间过的真快. 这次的目标是再回顾一下传统的N层架构并且分析一下在DDD中的N层架构. 一.先来看一看传统的N层架构 N-层架构的出现,主要是由于观注点的分离而产生,这三 ...

  4. [译]ABP框架使用AngularJs,ASP.NET MVC,Web API和EntityFramework构建N层架构的SPA应用程序

    本文转自:http://www.skcode.cn/archives/281 本文演示ABP框架如何使用AngularJs,ASP.NET MVC,Web API 和EntityFramework构建 ...

  5. ABP-N层架构

    ABP理论学习之N层架构   返回总目录 自从写这个系列博客之后,发现很多园友还是希望有个直接运行的demo,其实在github上就有官方的demo,我直接把这demo的链接放到这里吧,另外,我分析, ...

  6. MVC中的七层架构

    工厂模式的七层架构 1.创建Model,实现业务实体. 2.创建IDAL,实现接口. 3.创建DAL,实现接口里的方法. 4.创建DBUtility,数据库操作类5.创建DALFactory,抽象工程 ...

  7. ABP官方文档翻译 1.2 N层架构

    N层架构 介绍 ABP架构 其他(通用) 领域层 应用层 基础设施层 网络和展现层 其他 总结 介绍 应用程序代码库的分层架构是被广泛认可的可以减少程序复杂度.提高代码复用率的技术.为了实现分层架构, ...

  8. 关于项目中的DAL数据接入层架构设计

    摘要:项目中对关系型数据库的接入再寻常不过,也有海量的ORM工具可供选择,一个一般性的DAL数据接入层的结构却大同小异,这里就分享一下使用Hibernate.Spring.Hessian这三大工具对D ...

  9. 分享一套Code Smith 搭建N层架构模板

    开篇 平常开发时,由于冗余代码过多,程序员做重复的工作过多势必会影响开发效率.倘若 对重复性代码简单的复制.粘贴,虽然也能节省时间,但也需仔细一步步替换,这无疑也是一件费力的事.这时我们急需代码生成工 ...

随机推荐

  1. ajax(省,市,县)三级联动

    下面我们用Jquery,ajax,做一个省,市,县的三级联动: 下面是我做三级联动下拉的步骤以及逻辑 第一步:先做一个省市区表格 第二步:建个PHP页面显示用我是在<body>里放< ...

  2. ubuntu 笔记

    Ubuntu学习之路还很长,做个笔记也不亏 terminal tab 补全忽略大小写: 在 /ect/inputrc文件中添加或修改 'set completion-ignore-case on' U ...

  3. Exchange 2016 体系结构

    Exchange Server 2016 使用一个构建基块体系结构,提供电子邮件服务,以便在各种规模的组织(从小型组织到最大规模的跨国企业)进行部署.这种体系结构如下图所示.包含两个角色,邮箱服务器角 ...

  4. javascript-引用类型--Object类型

    引用类型是一种数据结构,本质是数据和功能的集合.引用类型有时也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法.引用类型相当于java里面的类,javascript虽然是一门面向对象语言,但 ...

  5. MonkeyRunner之小白如何使用MonkeyRecorder录制回放脚本

    之前摸索了好久.学习Python语言.安装工具.拉拉溜溜也慢慢地一点点进步.每天就疯狂的上网找资料.虽然大牛们写的很详细.但是自己就是笨的不知怎么做.最后找了一篇文章,真的就是万事俱备只欠东风的感觉, ...

  6. css动画特效与js动画特效(一)------2017-03-24

    1.用css做动画效果: 放鼠标才会发生 利用hover <head> <style> #aa{ background-color: red; width: 100px; he ...

  7. Linux之sort命令

    sort - sort lines of text files 提示:如果第一个字段都相同的话,就根据第二个字段进行排序 参数: -f  忽略大小写 -b  忽略最前面的空格部分 -M  以月份的名字 ...

  8. NIO(四、Selector)

    目录 NIO(一.概述) NIO(二.Buffer) NIO(三.Channel) NIO(四.Selector) Selector 前面两个章节都描述了Buffer和Channel,那这个章节就描述 ...

  9. Atom 编辑器试用

    简介 它号称"21世纪可黑客的文本编辑器".GitHub支持并开源,并支持跨平台.和brackets编辑器一样基于浏览器开发,意味着你可以使用less(包含css)来定制编辑器界面 ...

  10. 转载 webstrom识别 React语法

    对于程序员而言:驼峰和下划线之间是一场宗派战争:大括号是否换行会成为一种党派:逗号写在行尾还是行首的人来自不同星球-- 然而,无规矩不成方圆,任何一个团队,要想有高质量的产出,第一步必须要对一些基本的 ...