从零开始学习ABP vNext开发 (一)————概述

DDD中涉及的技术因素很多,聚合根、实体、值对象、领域事件、存储库、工作单元、领域服务、应用服务等等,还涉及架构的组织,如分层架构、微服务架构等等,还得加上日志、审计等需求……。一个项目如果从头构建,集成所有这些技术就是一个比较大的工程。从另一方面讲,所涉及的这些技术因素都有成熟的解决方案,如果将它们设计在一起,形成支撑框架,在框架的基础上引入业务特定的领域模型,在工程实践中是一种不错的选择。ABP vNext是.Net社区中流行的DDD技术框架,本系列文章介绍ABP vNext的学习。

ABP 简介

Asp.Net Boilerplate是基于.Net平台的开源Web应用框架,采用多层体现结构,模块化的开发方法,同时支持Asp.Net Core和Asp.Net MVC,是.Net社区流行的Web应用框架。主要特点:

  • 模块化:框架设计为模块化和可扩展,ABP提供模块化的开发方法。
  • 多租户:从数据库到界面层,都支持多租户的设计。
  • 多层结构:采用多层结构。
  • 集成成熟的技术:框架集成了各种流行技术,由于采用模块化开发,很容易进行技术替换。

ABP vNext 简介

从名称中可以看出来ABP vNext是下一代的ABP,同样是基于.Net平台开源的Web应用框架。由于ABP同时支持Asp.Net Core和Asp.Net Framework,很多.Net平台新引入的特性不能使用,也是由于商业化的需求,在ABP的基础上派生出了ABP vNext。

ABP vNext具有社区版和商业版两个版本,仍然采用模块化方式,支持微服务架构,支持DDD开发,支持多种前端技术。

ABP vNext提供了命令行工具,可以通过命令行交互的方式,方便地创建项目。同时还提供了各种项目类型的模板,很容易创建单体Web应用、前后端分离的Web应用和基于微服务的应用等各种形式的应用。

使用技术框架开发的优势和代价

使用成熟的技术框架开发项目具有如下优势:

  • 降低了技术门槛。技术框架中集成了大量的优秀成熟的技术,使用技术框架可以方便快速地引入这些技术到项目中,降低了使用这些技术的门槛。
  • 减少了技术集成工作量。DDD开发涉及多种技术,将这些技术有机地集成在一起,形成可以运行的系统,需要投入资源进行研究。成熟的技术框架解决了技术集成问题,可以缩短技术落地的时间。
  • 使开发人员关注于业务。由于技术框架解决了基础的技术问题,并且提供了构建系统的模板,开发人员的注意力可以集中在业务逻辑的实现上。

然而,使用技术框架开发也有相应的对价(tradeoff):

  • 领域模型与框架协调的问题。领域驱动设计的核心是领域模型,我们希望领域模型不依赖任何框架。而在框架的基础上设计领域模型,必然需要引入框架中的各种定义,这使项目在初期就绑定到具体的实现框架,这种方式显然不是我们所希望的。有一种方法是在设计领域模型时不考虑框架,后期引入框架时再改造领域模型以适应框架。不推荐使用这种方法,因为领域模型是需要迭代修改的,第一个迭代周期可以这样进行,如果需要修改,该如何处理呢?显然不可能回退修改,再次集成。
  • 框架的使用限制了开发过程的灵活性。框架本身对开发过程有一定的约束,这种约束与实际中采用的开发过程有可能发生冲突,使用框架开发,必须要结合开发过程的设计和调整。
  • 与其它系统的集成。框架本身自带的某些功能可能成为系统间集成的限制。比如框架提供的认证方式不被其它系统支持等。这种情况下,需要对框架有深层次的了解,而对框架本身的深入学习削弱了使用框架的动力:使用框架的目的是将注意力集中在业务,减少对技术问题的精力投入。
  • 遇到问题难以找到原因。如果系统比较复杂,当系统出现问题时,如果对框架的结构和运行原理了解不多,那么出现问题往往难以发现。以ABP vNext为例,框架大量使用了动态代理,当出现问题时,从日志中往往只能找到是某个动态代理出现了问题,不能直接定位到导致问题的源头,需要按照模块之间的引用层级逐级检查,往往很小的问题,需要很长时间才能发现原因。这种情况下,对框架的了解和研究时间抵消了使用框架带来的好处。

如何使用技术框架

从上面的分析可以看出,技术框架的使用是项目开发战略性的问题,不是战术问题。因为框架本身会影响整个开发过程。所有,如果在面向DDD的开发中使用某种技术框架,需要:

1) 对该技术框架有深入的了解。不能因为项目时间紧,抓来就用。
2) 建立基于技术框架的领域模型构建方法。包括需要解决如何将领域模型无缝集成到框架中,在领域模型设计是如何进行测试等问题。
3) 建立基于技术框架的集成方案,包括如何实现与其它系统的认证集成,比如单点登录等等。

只有当这些问题都得到解决后,才可以在项目中使用技术框架。当然,一旦上述问题得到解决,在多个项目中使用相同的框架还是收益大于成本的。

本系列文章的目的就是帮助读者熟悉ABP的使用,为在项目中使用这个成熟的框架打下基础。