[.Net]使用Soa库+Abp搭建微服务项目框架(一):Abp与DDD相关知识回顾
在企业中大型项目中,随着业务的不断拓展,项目发展到一定程度,需要寻求项目的各模块解耦,独立成为微服务。如何实现呢?
首先我们先来简单回顾一下Abp框架怎样实现(DDD)领域驱动设计的,Abp框架的全称是:Asp.Net Boilerplate Project(即Asp.Net 的样板项目),我们知道在领域驱动设计中,我们可以将整个系统分为四个大的层次,每一个层次都有其特定的功能,所以整个项目整体结构是非常清楚的。
Eric Evans在《领域驱动设计-软件核心复杂性应对之道》这本书中提出了传统的四层架构模式,这也是Abp框架目前所用到的分层模型,如下图所示:

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

可以看到这几个项目,通过分析,分层模型大致对应到具体的项目为:
- MatoProject.Application:应用层,定义与UI层交互的标准接口内容,包括交互的方式(HttpPost 或者 Get),权限分配(Authorization),定义数据传输对象(Dto)表明上层关心的模型 ,这一层常用于组装数据并返回;
- MatoProject.Core:领域层,包含了业务对象实体类Entity,一些实体类的操作方法,一些核心的算法等,也就是Abp定义的领域服务(DomainService),这个是整个应用的核心部分;
- MatoProject.Web.Host,MatoProject.Web.Core 以及Abp框架本体:基础设施层,提供帮助类,比如ORM以及UnitOfWork的对象,从而为上面更高层次提供基础服务;
- 调用整个应用层接口的前端项目,视为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相关知识回顾的更多相关文章
- SpringCloud:搭建微服务项目框架 microservicecloud
1.搭建整体父工程 microservicecloud 新建父工程microservicecloud,切记是Packageing是pom模式 主要是定义POM文件,将后续各个子模块公用的jar包等统一 ...
- [Abp vNext微服务实践] - 框架分析
一.简介 abp vNext新框架的热度一直都很高,于是最近上手将vNext的微服务Demo做了一番研究.我的体验是,vNext的微服务架构确实比较成熟,但是十分难以上手,对于没有微服务开发经验的.n ...
- Soa: 一个轻量级的微服务库
Soa 项目地址:Github:MatoApps/Soa 介绍 一个轻量级的微服务库,基于.Net 6 + Abp框架 可快速地将现有项目改造成为面向服务体系结构,实现模块间松耦合. 感谢 Rabbi ...
- [Abp vNext微服务实践] - 文章目录
简介 ABP vNext是volosoft的新一代框架,ABP(vNext)完全使用.NET CORE和DDD(领域驱动)打造,目前GitHub已有6K+次提交,发布版本超过40次,Nuget包下载量 ...
- 使用Yii2的Web框架搭建微服务框架
方法 使用自己的Yii2镜像作为基础 使用Yii2的Web框架搭建,为了节省搭建Yii2框架的时间,直接使用现有的Yii2项目,删除了业务相关的逻辑类,将这个代码库作为搭建微服务框架的基础,本身已经积 ...
- 【译文】用Spring Cloud和Docker搭建微服务平台
by Kenny Bastani Sunday, July 12, 2015 转自:http://www.kennybastani.com/2015/07/spring-cloud-docker-mi ...
- 手把手教你使用spring cloud+dotnet core搭建微服务架构:服务治理(-)
背景 公司去年开始使用dotnet core开发项目.公司的总体架构采用的是微服务,那时候由于对微服务的理解并不是太深,加上各种组件的不成熟,只是把项目的各个功能通过业务层面拆分,然后通过nginx代 ...
- spring cloud+.net core搭建微服务架构:服务注册(一)
背景 公司去年开始使用dotnet core开发项目.公司的总体架构采用的是微服务,那时候由于对微服务的理解并不是太深,加上各种组件的不成熟,只是把项目的各个功能通过业务层面拆分,然后通过nginx代 ...
- 从面向服务架构(SOA)学习:微服务时代应该借鉴的5条经验教训
[编者按]本文作者为 Matt McLarty,通过介绍 SOA 的兴衰变化,总结了微服务应该借鉴的5条经验教训.文章系国内 ITOM 管理平台 OneAPM 编译呈现. SOA 的兴衰变化让我们更了 ...
- [译]ABP vNext微服务演示,项目状态和路线图
译注: ABP的主要负责人hikalkan最近又发布了一篇博客, 说明了ABP vNext的微服务演示,项目状态和路线图.其中特意对ABP的中文社区进行了感谢! 本文翻译自该博客文章(https:// ...
随机推荐
- Midjourney|文心一格 Prompt:完整参数列表、风格汇总、文生图词典合集
Midjourney|文心一格 Prompt:完整参数列表.风格汇总.文生图词典合集 1.Midjourney 完整参数列表 参数名称 调用方法 使用案例 注意事项 V5 V4 V3 niji 版本 ...
- 【七】强化学习、gym学习平台扩充,更好的玩转虚拟环境,关于mujoco、mujoco-py、baselines安装配置
相关文章: [一]gym环境安装以及安装遇到的错误解决 [二]gym初次入门一学就会-简明教程 [三]gym简单画图 [四]gym搭建自己的环境,全网最详细版本,3分钟你就学会了! [五]gym搭建自 ...
- 通过URL载入ShellCode代码
将生成的shellcode放到web服务器上,本地不保存恶意代码,本地只负责加载到内存运行,这样可以很好的躲过查杀. 生成shellcode msfvenom -a x86 --platform Wi ...
- STM32CubeMX教程28 SDIO - 使用FatFs文件系统读写SD卡
1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 ...
- ChatGPT - 圈里的百科
ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI [1] 研发的聊天机器人程序 [12] ,于2022年11月30日发布 [ ...
- SSD数据不能恢复?或许还有的救
我们经常说机械硬盘相对于固态硬盘的一个优势是数据可以恢复,难道SSD固态硬盘的数据就不能恢复了吗? 这里先简单介绍一下SSD的工作方式,SSD中的数据是以电子的形式通过浮栅保存的,写入就是通过增加电压 ...
- SpringMVC的执行流程及初始化流程
今天大致来看一下Spring MVC的执行流程和初始化流程是什么样的 1,执行流程:也就是一个请求是怎么到我们Controller的 2,初始化流程:也就是那些 HandlerMapping.Hand ...
- flash8.ocx或其附件之一不能正确注册
运行书中自带光盘中的程序,在该程序的readme说明中,提到这类错误,解决方式是: 因为是免安装程序,需要运行"setup"文件夹下的setup.exe文件,安装控件.在安装完成后 ...
- Numpy基本使用方法
Numpy基本使用方法 第一节 创建数组 import numpy as np import random # 创建数组 a = [1, 2, 3, 4, 5] a1 = np.array(a) pr ...
- NC24605 [USACO 2011 Ope S]Corn Maze
题目链接 题目 题目描述 This past fall, Farmer John took the cows to visit a corn maze. But this wasn't just an ...