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. Mybatis框架中Mapper文件传值参数获取。【Mybatis】

    1.参数个数为1个(string或者int) dao层方法为以下两种: /** * 单个int型 */ public List<UserComment> findByDepartmentI ...

  2. centos6.6-6.8的cobbler的kickstarts文件

    author:headsen chendate: 2018-07-10 19:14:39 1,普通的mbr版的kickstarts的配置文件: [root@cobbler-server ~]# cat ...

  3. 通过AnimationSet 同步或一部播放多个动画 Android 属性动画(Property Animation) 完全解析 (下)

    AnimationSet提供了一个把多个动画组合成一个组合的机制,并可设置组中动画的时序关系,如同时播放,顺序播放等. 以下例子同时应用5个动画: 播放anim1: 同时播放anim2,anim3,a ...

  4. 电力项目七--js控制文字内容过长的显示和文本字数的显示

    当文本框中文字内容过长时,需要调整显示的样式 如上图所示的样式 对应的代码为: <div id="showInfomation" style="visibility ...

  5. ZOJ 3715 Kindergarten Election

    At the beginning of the semester in kindergarten, the n little kids (indexed from 1 to n, for conven ...

  6. IIS6中给Framework2,。0站点的虚拟目录(2.0版本)下发布Web API项目(4.0版本)问题处理

    Web-API项目以虚拟目录形式部署到IIS6/IIS7 若原有站点为Framework2.0版本,在此站点(或虚拟目录站点)下,新增API虚拟目录,然后选择Framework4.0版本,IIS6和I ...

  7. 如何让ios启动画面停留更长时间

    几种方法: 方法1:在AppDelegate.m里写上 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithO ...

  8. 通过Nginx反向代理实现IP分流

    通过Nginx做反向代理来实现分流,以减轻服务器的负载和压力是比较常见的一种服务器部署架构.本文将分享一个如何根据来路IP来进行分流的方法. 根据特定IP来实现分流 将IP地址的最后一段最后一位为0或 ...

  9. Storm-源码分析-Topology Submit-Supervisor

    mk-supervisor (defserverfn mk-supervisor [conf shared-context ^ISupervisor isupervisor] (log-message ...

  10. python数据分析基础——numpy和matplotlib

    numpy库是python的一个著名的科学计算库,本文是一个quickstart. 引入:计算BMI BMI = 体重(kg)/身高(m)^2假如有如下几组体重和身高数据,让求每组数据的BMI值: w ...