在企业中大型项目中,随着业务的不断拓展,项目发展到一定程度,需要寻求项目的各模块解耦,独立成为微服务。如何实现呢?

首先我们先来简单回顾一下Abp框架怎样实现(DDD)领域驱动设计的,Abp框架的全称是:Asp.Net Boilerplate Project(即Asp.Net 的样板项目),我们知道在领域驱动设计中,我们可以将整个系统分为四个大的层次,每一个层次都有其特定的功能,所以整个项目整体结构是非常清楚的。

Eric Evans在《领域驱动设计-软件核心复杂性应对之道》这本书中提出了传统的四层架构模式,这也是Abp框架目前所用到的分层模型,如下图所示:

怎样将模型落地到项目中呢? 我们先来分析一下Abp官方生成项目中的目录结构。以“MatoProject”为命名空间从Abp官网生成一个原始项目,打开解决方案:

可以看到这几个项目,通过分析,分层模型大致对应到具体的项目为:

  1. MatoProject.Application:应用层,定义与UI层交互的标准接口内容,包括交互的方式(HttpPost 或者 Get),权限分配(Authorization),定义数据传输对象(Dto)表明上层关心的模型 ,这一层常用于组装数据并返回;
  2. MatoProject.Core:领域层,包含了业务对象实体类Entity,一些实体类的操作方法,一些核心的算法等,也就是Abp定义的领域服务(DomainService),这个是整个应用的核心部分;
  3. MatoProject.Web.Host,MatoProject.Web.Core 以及Abp框架本体:基础设施层,提供帮助类,比如ORM以及UnitOfWork的对象,从而为上面更高层次提供基础服务;
  4. 调用整个应用层接口的前端项目,视为UI层:负责用户交互的功能,这里我们可以简单理解成前端项目以及其它可以和用户进行交互的可视化方式,这一层只用于进行展示。

其他的MatoProject.EntityFrameworkCore,和MatoProject.Migurator,属于脚手架相关服务,负责搭建实体对应的数据库表结构以及创建种子数据,用于迁移过程中向数据库写入原始数据。

这是Abp对项目的分层,不同的开发人员对DDD的理解不同,项目分层结构亦有不同之处。

基于这个基础项目,假设我们有几个功能要实现,他们的名称分别为MainService,Service1,Service2。这些实现都是属于独立的业务范畴,我们首先在领域层中建立他们的服务:

以及领域模型,MainEntity,Entity1, Entiy2。

应用层建立各个服务,以及增删查改的封装:

基础设施层可以依赖于Abp的项目,还有自定义的帮助类,都丢到Infrastructure项目中

整个解决方案的结构类似这样:

回到刚刚的问题,刚才提到MainService,Service1,Service2是独立的业务模块,怎样的业务划分可以独立成业务模块?这就要讨论一个业务的上下文边界(BC)问题

不同的系统或者子系统有各自的模型(算法,数据,行为)。两个系统中业务之间共同依赖的逻辑则是上下文边界,它起到桥梁的作用。

例如客户关系管理系统(CRM),交易记录子系统和客户支持子系统都会调用客户实体、产品实体的属性和数据。这样就产生了上下文边界, 而它们是隶属于各自不同上下文边界,如下图:

引用自BoundedContext (martinfowler.com)

具体如何落实处理上下文边界的问题呢?在传统的系统中,客户实体、产品实体是被两个子系统引用的,他们之间是强关联状态

下一章开始,介绍如何用面向服务体系的方式,完全解耦模块之间的关联。

[.Net]使用Soa库+Abp搭建微服务项目框架(一):Abp与DDD相关知识回顾的更多相关文章

  1. SpringCloud:搭建微服务项目框架 microservicecloud

    1.搭建整体父工程 microservicecloud 新建父工程microservicecloud,切记是Packageing是pom模式 主要是定义POM文件,将后续各个子模块公用的jar包等统一 ...

  2. [Abp vNext微服务实践] - 框架分析

    一.简介 abp vNext新框架的热度一直都很高,于是最近上手将vNext的微服务Demo做了一番研究.我的体验是,vNext的微服务架构确实比较成熟,但是十分难以上手,对于没有微服务开发经验的.n ...

  3. Soa: 一个轻量级的微服务库

    Soa 项目地址:Github:MatoApps/Soa 介绍 一个轻量级的微服务库,基于.Net 6 + Abp框架 可快速地将现有项目改造成为面向服务体系结构,实现模块间松耦合. 感谢 Rabbi ...

  4. [Abp vNext微服务实践] - 文章目录

    简介 ABP vNext是volosoft的新一代框架,ABP(vNext)完全使用.NET CORE和DDD(领域驱动)打造,目前GitHub已有6K+次提交,发布版本超过40次,Nuget包下载量 ...

  5. 使用Yii2的Web框架搭建微服务框架

    方法 使用自己的Yii2镜像作为基础 使用Yii2的Web框架搭建,为了节省搭建Yii2框架的时间,直接使用现有的Yii2项目,删除了业务相关的逻辑类,将这个代码库作为搭建微服务框架的基础,本身已经积 ...

  6. 【译文】用Spring Cloud和Docker搭建微服务平台

    by Kenny Bastani Sunday, July 12, 2015 转自:http://www.kennybastani.com/2015/07/spring-cloud-docker-mi ...

  7. 手把手教你使用spring cloud+dotnet core搭建微服务架构:服务治理(-)

    背景 公司去年开始使用dotnet core开发项目.公司的总体架构采用的是微服务,那时候由于对微服务的理解并不是太深,加上各种组件的不成熟,只是把项目的各个功能通过业务层面拆分,然后通过nginx代 ...

  8. spring cloud+.net core搭建微服务架构:服务注册(一)

    背景 公司去年开始使用dotnet core开发项目.公司的总体架构采用的是微服务,那时候由于对微服务的理解并不是太深,加上各种组件的不成熟,只是把项目的各个功能通过业务层面拆分,然后通过nginx代 ...

  9. 从面向服务架构(SOA)学习:微服务时代应该借鉴的5条经验教训

    [编者按]本文作者为 Matt McLarty,通过介绍 SOA 的兴衰变化,总结了微服务应该借鉴的5条经验教训.文章系国内 ITOM 管理平台 OneAPM 编译呈现. SOA 的兴衰变化让我们更了 ...

  10. [译]ABP vNext微服务演示,项目状态和路线图

    译注: ABP的主要负责人hikalkan最近又发布了一篇博客, 说明了ABP vNext的微服务演示,项目状态和路线图.其中特意对ABP的中文社区进行了感谢! 本文翻译自该博客文章(https:// ...

随机推荐

  1. 大语言模型的预训练4:指示学习Instruction Learning详解以及和Prompt Learning,In-content Learning区别

    大语言模型的预训练[4]:指示学习Instruction Learning:Entailment-oriented.PLM oriented.human-oriented详解以及和Prompt Lea ...

  2. 3.1 C/C++ 使用字符与指针

    C/C++语言是一种通用的编程语言,具有高效.灵活和可移植等特点.C语言主要用于系统编程,如操作系统.编译器.数据库等:C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统.图形用户界面 ...

  3. 7.2 通过API创建新进程

    创建新的进程是Windows程序开发的重要部分,它可以用于实现许多功能,例如进程间通信.并行处理等.其中,常用的三种创建进程的方式分别是WinExec().ShellExecute()和CreateP ...

  4. Volatility 内存数字取证方法

    计算机数字取证分为内存取证和磁盘取证,活取证与死取证,不管是那种取证方式,都应尽量避免破环犯罪现场,例如通过内存转储工具对内存进行快照,通过磁盘克隆工具对磁盘进行克隆,方便后期的分析工作,这里将研究内 ...

  5. CE修改器入门:运用代码注入

    从本关开始,各位会初步接触到CE的反汇编功能,这也是CE最强大的功能之一.在第6关的时候我们说到指针的找法,用基址定位动态地址.但这一关不用指针也可以进行修改,即使对方是动态地址,且功能更加强大. 代 ...

  6. 1.29 深痛教训 关于 unsigned

    unsigned long long 无符号长长整型,常用于比 long long 大一倍的整数范围或自然溢出 \(\bmod 2^{64}\) unsigned long long 范围为 \(0\ ...

  7. 5个.NET开源且强大的快速开发框架(帮助你提高生产效率)

    中台Admin(Admin.Core) 中台Admin(Admin.Core)是前后端分离权限管理系统,前端 UI 基于Vue3开发,后端 Api 基于.NET 8.0开发.支持多租户.接口权限.数据 ...

  8. CentOS7 卸载/home 扩大/root空间

    卸载home 备份home分区文件 # 新系统无视 tar cvf /tmp/home.tar /home 修改fstab(这一步非常重要,千万别漏了) 准备卸载/home文件系统,centos启动时 ...

  9. let与const

    let与const ES2015(ES6)新增加了两个重要的JavaScript关键字: let和const. 块级作用域 代码块内如果存在let或者const,代码块会对这些命令声明的变量从块的开始 ...

  10. IDEA从o开始的一系列操作及修改配置-快捷键汇总

    IDEA从o开始的一系列操作及修改配置-快捷键汇总 下载IDEA 启动idea 安装svn插件 功能快捷键 先设置提示快捷键(纯属个人喜好) 入门快捷键 查找 编辑 小功能 自动代码提示 自动导包 T ...