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

首先我们先来简单回顾一下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. Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--PDF预览器框选

    项目地址: Pdfium.Net:https://github.com/1000374/Pdfium.Net PdfiumViewer:https://github.com/1000374/Pdfiu ...

  2. django orm 筛选

    import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "test.setting") import ...

  3. 在package.json里面配置npx

    1.配置这个npx表示打包的时候选择本地node_modules安装的webpack来打包

  4. PHP基础题目

    1.请写一个函数实现以下功能:字符串'open_door'转换成'OpenDoor','make_by_id'转换成'MakeById' function strHandle($str) { $ret ...

  5. ElasticSearch7.3学习(十二)----type底层结构及弃用原因

    1.type是什么 type,是一个index中用来区分类似的数据的.类似的数据,但是可能有不同的fields,而且有不同的属性来控制索引建立.分词器.field的value. 在底层的lucene中 ...

  6. .NET Core开发实战(第3课:.NET Core的现状、未来以及环境搭建)--学习笔记

    03 | .NET Core的现状.未来以及环境搭建 .NET Core的现状 .NET Core 的应用场景:桌面端.Web端.云端.移动端.游戏.IOT 和 AI 云端指的是 .NET Core ...

  7. 写好C#代码的技巧

    写好C#代码的技巧 编者导语 本文来自https://www.pluralsight.com,作者Afzaal Ahmad Zeeshan. 原文包含以下三篇文章: <编写更好的C#代码简介&g ...

  8. JS Leetcode 1370. 上升下降字符串 题解分析,桶排序与charCodeAt fromCharCode妙用

    壹 ❀ 引 本题来自LeetCode1370. 上升下降字符串,难度简单,是一道考察对于字符串遍历熟练度的题目,题目描述如下: 给你一个字符串 s ,请你根据下面的算法重新构造字符串: 从 s 中选出 ...

  9. Centos中报错apt Command not Found

    先说结论: 在centos下用yum install xxxyum和apt-get的区别: 一般来说著名的linux系统基本上分两大类: RedHat系列:Redhat.Centos.Fedora等 ...

  10. SpringBoot+Shiro+LayUI权限管理系统项目-9.核心知识点总结

    1.说明 本篇讲一下本项目几个重要的知识点,详细看源码,文章下方捐赠或QQ联系捐赠获取. 2.Shiro如何设置密码加密算法 1.在shiro配置文件中添加: @Bean public HashedC ...