ABP(现代ASP.NET样板开发框架)系列之三、ABP分层架构

点这里进入ABP系列文章总目录html

 

基于DDD的现代ASP.NET开发框架--ABP系列之三、ABP分层架构
前端

 

ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。git

ABP的官方网站http://www.aspnetboilerplate.comgithub

ABP在Github上的开源项目https://github.com/aspnetboilerplate数据库

 


 

前言

为了减小复杂性和提升代码的可重用性,采用分层架构是一种被普遍接受的技术。
为了实现分层的体系结构,ABP遵循DDD(领域驱动设计)的原则,将分为四个层次:设计模式

  • 展示层(Presentation):提供一个用户界面,实现用户交互操做。
  • 应用层(Application):进行展示层与领域层之间的协调,协调业务对象来执行特定的应用程序的任务。它不包含业务逻辑。
  • 领域层(Domain):包括业务对象和业务规则,这是应用程序的核心层。
  • 基础设施层(Infrastructure):提供通用技术来支持更高的层。例如基础设施层的仓储(Repository)可经过ORM来实现数据库交互。

根据实际须要,可能会有额外添加的层。例如:浏览器

  • 分布式服务层(Distributed Service):用于公开应用程序接口供远程客户端调用。好比经过ASP.NET Web API和WCF来实现。

这些都是常见的以领域为中心的分层体系结构。不一样的项目在实现上可能会有细微的差异。前端框架


ABP的体系结构

一个简单的解决方案,大体包含5个项目:
服务器

每一层能够用一个或多个程序集来实现。架构

 

领域层(Domain)

领域层就是业务层,是一个项目的核心,全部业务规则都应该在领域层实现。

实体(Entity)
  实体表明业务领域的数据和操做,在实践中,经过用来映射成数据库表。

仓储(Repository
  仓储用来操做数据库进行数据存取。仓储接口在领域层定义,而仓储的实现类应该写在基础设施层。

领域服务(Domain service)
  当处理的业务规则跨越两个(及以上)实体时,应该写在领域服务方法里面。

领域事件(Domain Event)
  在领域层某些特定状况发生时能够触发领域事件,而且在相应地方捕获并处理它们。

工做单元(Unit of Work)
  工做单元是一种设计模式,用于维护一个由已经被修改(如增长、删除和更新等)的业务对象组成的列表。它负责协调这些业务对象的持久化工做及并发问题。


应用层(Application)

应用层提供一些应用服务(Application Services)方法供展示层调用。一个应用服务方法接收一个DTO(数据传输对象)做为输入参数,使用这个输入参数执行特定的领域层操做,并根据须要可返回另外一个DTO。在展示层到领域层之间,不该该接收或返回实体(Entity)对象,应该进行DTO映射。一个应用服务方法一般被认为是一个工做单元(Unit of Work)。用户输入参数的验证工做也应该在应用层实现。ABP提供了一个基础架构让咱们很容易地实现输入参数有效性验证。建议使用一种像AutoMapper这样的工具来进行实体与DTO之间的映射。

 

基础设施层(Infrastructure)

当在领域层中为定义了仓储接口,应该在基础设施层中实现这些接口。可使用ORM工具,例如EntityFramework或NHibernate。ABP的基类已经提供了对这两种ORM工具的支持。数据库迁移也被用于这一层。

 

WEB与展示层(Web & Presentation)

Web层使用ASP.NET MVC和Web API来实现。可分别用于多页面应用程序(MPA)和单页面应用程序(SPA)。
在SPA中,全部资源被一次加载到客户端浏览器中(或者先只加载核心资源,其余资源懒加载),而后经过AJAX调用服务端WebApi接口获取数据,再根据数据生成HTML代码。不会整个页面刷新。如今已经有不少SPA的JS框架,例如: AngularJs、 DurandalJs、BackboneJs、EmberJs。 ABP可使用任何相似的前端框架,可是ABP提供了一些帮助类,让咱们更方便地使用AngularJs和DurandalJs。

在经典的多页面应用(MPA)中,客户端向服务器端发出请求,服务器端代码(ASP.NET MVC控制器)从数据库得到数据,而且使用Razor视图生成HTML。这些被生成后的HTML页面被发送回客户端显示。每显示一个新的页面都会整页刷新。

SPA和MPA涉及到彻底不一样的体系结构,也有不一样的应用场景。一个管理后台适合用SPA,博客就更适合用MPA,由于它更利于被搜索引擎抓取。

SignalR是一种从服务器到客户端发送推送通知的完美工具。它能给用户提供丰富的实时的体验。

已经有不少客户端的Javascript框架或库,JQuery是其中最流行的,而且它有成千上万免费的插件。使用Bootstrap可让咱们更轻松地完成写Html和CSS的工做。

ABP也实现了根据Web API接口自动建立 Javascript的代码函数,来简化JS对Web Api的调用。还有把服务器端的菜单、语言、设置等生成到JS端。(可是在我本身的项目中,我是把这些自动生成功能关闭的,由于必要性不是很大,而这些又会比较影响性能)。

ABP会自动处理服务器端返回的异常,并以友好的界面提示用户。

 

其它

ABP使用Castle Windsor为整个程序框架提供依赖注入的功能。使用Log4Net日志记录组件,提供给其余各层调用以进行日志记录。

 


 

但愿更多国内的架构师能关注到ABP这个项目,也许这其中有能帮助到您的地方,也许有您的参与,这个项目能够发展得更好。

欢迎加QQ群:

ABP架构设计交流群:134710707 ABP架构设计交流群      ABP架构设计交流2群: 579765441ABP架构设计交流群2

 

点这里进入ABP系列文章总目录

相关文章
相关标签/搜索