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层架构应用的伟大基础设施。它还有可以轻松创建分层解决方案的模板,以此可以作为我们应用的起点。

返回主目录

ABP官方文档翻译 1.2 N层架构的更多相关文章

  1. ABP官方文档翻译 5.2 动态We API层

    动态Web APID层 创建动态Web API控制器 ForAll方法 重写ForAll ForMethods Http动词 WithVerb方法 HTTP特性 命名约定 API管理器 RemoteS ...

  2. ABP官方文档翻译 1.1 介绍

    介绍 介绍 快速示例 其他 启动模板 如何使用 介绍 我们通常会根据不同的需求来创建不同的应用程序.但是对于一些通用相似的结构总是一遍又一遍的实现,至少在某种程度上是这样的.常见的通用模块如授权.验证 ...

  3. 0.0 ABP官方文档翻译目录

    一直想学习ABP,但囿于工作比较忙,没有合适的契机,当然最重要的还是自己懒.不知不觉从毕业到参加工作七年了,没留下点儿什么,总感觉很遗憾,所以今天终于卯足劲鼓起勇气开始写博客.有些事能做的很好,但要跟 ...

  4. ABP官方文档翻译 10.1 ABP Nuget包

    ABP Nuget包 Packages Abp Abp.AspNetCore Abp.Web.Common Abp.Web Abp.Web.Mvc Abp.Web.Api Abp.Web.Api.OD ...

  5. ABP官方文档翻译 9.3 NHibernate集成

    NHibernate集成 Nuget包 配置 实体映射 仓储 默认实现 自定义仓储 应用程序特定基础仓储类 ABP可以使用任何ORM框架,它内置集成NHibernate.此文档将讲解ABP如何使用NH ...

  6. ABP官方文档翻译 9.2 Entity Framework Core

    Entity Framework Core 介绍 DbContext 配置 在Startup类中 在模块PreInitialize方法中 仓储 默认仓储 自定义仓储 应用程序特定基础仓储类 自定义仓储 ...

  7. ABP官方文档翻译 9.1 EntityFramework集成

    EntityFramework集成 Nuget包 DbContext 仓储 默认仓储 自定义仓储 应用特定的基础仓储类 自定义仓储示例 仓储最佳实践 事务管理 数据存储 ABP可以使用ORM框架,它内 ...

  8. ABP官方文档翻译 8.2 SignalR集成

    SignalR集成 介绍 安装 服务器端 客户端 建立连接 內建特征 通知 在线客户端 PascalCase与CamelCase对比 你的SignalR代码 介绍 ABP中的Abp.Web.Signa ...

  9. ABP官方文档翻译 6.7 CSRF/XSRF保护

    CSRF/XSRF保护 介绍 HTTP动词 非浏览器客户端 ASP.NET MVC 特征 集成 布局视图 配置 ASP.NET Web API 特征 集成 集成到ASP.NET MVC客户端 集成到其 ...

随机推荐

  1. Linux命令之乐--read

    read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量 -p:后接屏幕输出的提示语句 -n:设定输入的字符个数,当达到指定的个数则自动退出,并将输入赋予给变量 -t:当输 ...

  2. poj_1258 prim最小生成树

    题目大意 给定N个点,以及每两个点之间的路径长度,求出一个连接这N个点的方案,使得连接这N个点的总长度最短,求出该总长度. 题目分析 求最小生成树MST的模板题,直接使用prim算法进行求解. 实现( ...

  3. Android开源项目分类汇总【畜生级别】

    From :http://blog.csdn.net/forlong401/article/details/25459403?c=6c4cd677a617db4655988e41ee081691#t7 ...

  4. python裁剪base64编码的图片

    简介 今天遇到需要裁剪base64字符串的PNG图片,并返回base64格式字符串的任务,捣鼓半天. 裁剪代码如下: def deal_inspect_img(base64_str): "& ...

  5. js访问CSS最终计算样式

    所谓计算样式,就是嵌入式样式.外部样式表.内联样式综合的样式表现,那么如何来获取呢? "DOM2 级样式"增强了document.defaultView,提供了getCompute ...

  6. Hibernate-sessio缓存的操作

    首先咋们看一个图: flush:首先箭头是由缓存指向数据库,即当我调用 Session.flush()方法时它会强制使数据库的记录跟缓存 中的对象状态保持同步 ,如果不一致,就会发送Sql语句 ,保持 ...

  7. HTML5跨平台开发环境配置

    http://hi.baidu.com/kuntakinte/item/1bbd3759b4901a3695eb050c

  8. SignalR循序渐进(一)简单的聊天程序

    前阵子把玩了一下SignalR,起初以为只是个real-time的web通讯组件.研究了几天后发现,这玩意简直屌炸天,它完全就是个.net的双向异步通讯框架,用它能做很多不可思议的东西.它基于Owin ...

  9. 字符串与图片的Base64编码转换操作

    //图片 转为 base64编码的文本 private void button1_Click(object sender, EventArgs e) { OpenFileDialog dlg = ne ...

  10. 设计模式之Singleton模式

    当程序运行时,有时会希望在程序中,只能存在一个实例,为了达到目的,所以设计了Singleton模式,即单例模式. 单例模式的特征: 想确保任何情况下只存在一个实例 想在程序上表现出只存在一个实例 示例 ...