ABP官方文档翻译 1.2 N层架构
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层架构的更多相关文章
- ABP官方文档翻译 5.2 动态We API层
动态Web APID层 创建动态Web API控制器 ForAll方法 重写ForAll ForMethods Http动词 WithVerb方法 HTTP特性 命名约定 API管理器 RemoteS ...
- ABP官方文档翻译 1.1 介绍
介绍 介绍 快速示例 其他 启动模板 如何使用 介绍 我们通常会根据不同的需求来创建不同的应用程序.但是对于一些通用相似的结构总是一遍又一遍的实现,至少在某种程度上是这样的.常见的通用模块如授权.验证 ...
- 0.0 ABP官方文档翻译目录
一直想学习ABP,但囿于工作比较忙,没有合适的契机,当然最重要的还是自己懒.不知不觉从毕业到参加工作七年了,没留下点儿什么,总感觉很遗憾,所以今天终于卯足劲鼓起勇气开始写博客.有些事能做的很好,但要跟 ...
- 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 ...
- ABP官方文档翻译 9.3 NHibernate集成
NHibernate集成 Nuget包 配置 实体映射 仓储 默认实现 自定义仓储 应用程序特定基础仓储类 ABP可以使用任何ORM框架,它内置集成NHibernate.此文档将讲解ABP如何使用NH ...
- ABP官方文档翻译 9.2 Entity Framework Core
Entity Framework Core 介绍 DbContext 配置 在Startup类中 在模块PreInitialize方法中 仓储 默认仓储 自定义仓储 应用程序特定基础仓储类 自定义仓储 ...
- ABP官方文档翻译 9.1 EntityFramework集成
EntityFramework集成 Nuget包 DbContext 仓储 默认仓储 自定义仓储 应用特定的基础仓储类 自定义仓储示例 仓储最佳实践 事务管理 数据存储 ABP可以使用ORM框架,它内 ...
- ABP官方文档翻译 8.2 SignalR集成
SignalR集成 介绍 安装 服务器端 客户端 建立连接 內建特征 通知 在线客户端 PascalCase与CamelCase对比 你的SignalR代码 介绍 ABP中的Abp.Web.Signa ...
- ABP官方文档翻译 6.7 CSRF/XSRF保护
CSRF/XSRF保护 介绍 HTTP动词 非浏览器客户端 ASP.NET MVC 特征 集成 布局视图 配置 ASP.NET Web API 特征 集成 集成到ASP.NET MVC客户端 集成到其 ...
随机推荐
- vue+webpack2实现路由的懒加载
当打包构建应用时,Javascript 包会变得非常大,影响页面加载.如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了. 结合 Vue 的异步组 ...
- git练习
git commit 提交记录 git branch <branch_name> 建立名为branch_name的分支 git checkout <name>:git comm ...
- 各种层次NET人应该知道些什么?
A.任何一个使用.NET的人 1.描述线程与进程的区别? 2.什么是Windows服务,它的生命周期与标准的EXE程序有什么不同 ? 3.Windows上的单个进程所能访问的最大内存量是多少?它与系统 ...
- 【BZOJ2287】【POJ Challenge】消失之物 背包动规
[BZOJ2287][POJ Challenge]消失之物 Description ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了 ...
- PL/SQL Developer使用技巧、快捷键(转载)
1.类SQL PLUS窗口:File->New->Command Window,这个类似于oracle的客户端工具sql plus,但比它好用多了. 2.设置关键字自动大写:Tools-& ...
- AngularJS 解决 SEO 问题
由于 AngularJS 返回的是HTML模板,实际的内容需要执行JS以后才会填充进去,导致百度抓取蜘蛛抓不到,因此产生了 AngularJS 的 SEO 问题.经过几天的研究试验,我们的解决方案是这 ...
- Java中的常用方法
Java中的常用方法 第一章 字符串 1.获取字符串的长度:length() 2.判断字符串的前缀或后缀与已知字符串是否相同 前缀 startsWith(String s).后缀 endsWit ...
- C#全角半角转换输出解决方法
Microsoft.VisualBasic 命名空间 Strings 模块 StrConv 函数就具有大写/小写.全角/半角.中文简体/繁体等转换功能,字符串转换应该说是VB.NET的强项,是这样的: ...
- http协议----->请求头和响应头
http实用头字段-----Range 如果请求里有这个range头,那么响应里也有 1.首先在webroot下放好a.txt 内容如下: 2.然后在本地有个下载未完成的a.txt 本地a.txt内容 ...
- Chandy-Lamport_algorithm
Chandy-Lamport algorithm - Wikipedia https://en.m.wikipedia.org/wiki/Chandy-Lamport_algorithm 经典快照算法 ...