首页 > 其他分享 >领域服务的竖向裁切, 横向裁切 - 模块化架构

领域服务的竖向裁切, 横向裁切 - 模块化架构

时间:2024-05-27 19:44:14浏览次数:14  
标签:Domain 服务 裁切 Service 模块化 逻辑 业务 竖向

1. 背景:

    在复杂多变的业务场景中,在开发完一个项目后,往往需要为多个业务方提供共性的业务能力,但是不同的业务方又会有个性的需求,如何在保证软件的核心能力的稳固的同时,同时低成本地支持拓展性?

2. 可行方式:

    通常通过业务抽象实现是可以对多变但同质业务进行支持,只是有些时候通过抽象无法解决,或者解决成本过高,过度的抽象往往也会增加系统的复杂度,那么这个时候可以通过应用功能模块化 来定制化组合拓展应用程序,同时也能复用部分业务能力

3. 竖向裁切

    通过DDD来划分领域边界,同时也可以作为微服务拆分的依据。通过建立业务层面的领域模型和技术层面的微服务边界划分,实现不同微服务独立提供业务能力。同时应对不同区域对于业务能力的取舍,也可以方便地通过微服务的裁切组合,服务之间通过消息适配器耦合,来提供个性化的服务;
解耦合的方式:通过微服务独立部署,然后通过消息适配器来实现弱耦合,消息适配器是易变的,个性的。

4. 横向裁切

    通常在领域应用的分层中,越靠近内核的 越是不易变的,共性的逻辑;越是外层的 越是易变的,个性的逻辑。通过对不同layer进行代码隔离,可以达到继承覆盖的方式来进行已有功能的拓展,替换jar包的方式来实现易变逻辑的完全替代。来实现底层领域能力的复用,并支持业务多样性。
优点:个性需求,从代码到服务层面都进行分离,不同业务方基本不会互相影响,同时又能复用公共的底层能力代码
缺点:重新组合的服务,需要独立部署,产生数据隔离。

4.1 不同Lay替换和拓展的方式
4.1.1 Domain Model

    由于Domain Model存有最核心的业务逻辑,需要修改这里的逻辑应该是共性的逻辑,替换或者拓展的可能性比较小;

4.1.2 Domain Service

    Domain Service 直接依赖Domain Model,负责对多个或者单个领域能力进行包装组合,如果这里的业务逻辑需要改变的话,可以通过继承Service并重写的方式来改变指定逻辑,适合修改部分少,同时需要复用部分原有逻辑的场景;又或者直接写一个新的Domain Service替换掉原有的jar,因为Domain Controller通过Service API来耦合Domain Service的,所以不会把影响向上传播。

4.1.3 Domain Controller

    拓展逻辑基本和Domain Service相同

4.2 常见的业务差异点:
  1. 个性化的 字段需求,包含录入,查询,搜索场景,需要通过动态字段,以及OLAP进行适配

  2. 个性化的 校验逻辑的需求,根据输入的信息,关联的外部信息,核心的状态信息 进行个性化的逻辑分支判断,通过逻辑剥离到Domain Controller层进行适配

  3. 个性化的 状态机流转,比如跨状态流转,某些状态对于某些业务来说是不需要的

5. 关联文章

Unlocking the Power of Modular Architecture and DDD

CQRS pattern

标签:Domain,服务,裁切,Service,模块化,逻辑,业务,竖向
From: https://www.cnblogs.com/IC1101/p/18189543

相关文章

  • ‘模块化‘ ’信息隐藏和局部化’
    什么是模块化:模块化是将一个系统或项目分解成独立的、可替换的模块,每个模块具有特定的功能和接口。通过将系统分解为模块,可以更好地组织和管理代码,提高代码的可读性、可维护性和可扩展性。为什么要模块化:1. 提高代码的组织性和可读性2. 降低代码的复杂性3. 增强代码的可......
  • 三菱works3模块化技巧1-上一篇的程序示例
    1上一页,下一页对应HMI上的增减按钮,默认100页,从0开始,范围做一个限制2根据上一篇讲到的,每页8个阀门,对应16个控制和16个反馈,可以用M也可以用D,这里拿M举例3通过页数的变化来做清零4通过循环指令,预留16个名称更改,通过D100Z1变址寄存器实现,对应的序号通过Z2,只需在HMI中新......
  • cesium裁切面实践
    cesium裁切面实践:沙盒地址打不开的自行科学访问<style>@importurl(../templates/bucket.css);#toolbar{background:rgba(42,42,42,0.8);padding:4px;border-radius:4px;}#toolbarinput{vertical-al......
  • 从MASM全局标识符谈模块化开发
      博主学习的第一个编程语言是C语言(跟谭教授学的),当时时就疑惑一个问题,为什么要将源码分成多个文件,每个文件编译成目标文件(obj)文件后,再通过连接程序(link)将多个目标文件连接成单个执行文件。后来通过更深入的开发一些规模稍大一点的软件,及了解计算机的发展历史后,逐渐清晰起来:......
  • Java 9的模块化系统(JPMS):探讨Java 9引入的模块化系统,并解释其对Java生态的影响
    Java9模块化系统(JPMS)简介Java9模块系统,也被称为Java平台模块系统(JPMS),它是Java9的核心特性之一,用于改进Java的大型应用的封装性和可维护性。 JPMS的主要功能如下: 模块化代码:JPMS允许你将代码库划分为不同的模块,在没有显示声明的情况下,模块内部的类......
  • 1.什么是模块化,为什么要模块化? 2.衡量模块化独立的定性标准是什么?用自己的话表达其含
    模块化是将一个系统划分为多个独立的模块或组件,每个模块负责处理系统的一部分功能或任务。模块化能够使代码结构更清晰、易于维护和扩展,提高代码的重用性和可读性。通过模块化,开发人员可以更加高效地协同工作,降低系统复杂度。衡量模块化独立的定性标准包括内聚性和耦合性。内......
  • 什么是模块化,为什么要模块化
    1.模块化就是将复杂的系统或功能拆分成多个相对独立、功能单一的模块。2.优点:这样做可以简化开发、提高代码复用性、降低维护成本,并提升整个系统的可扩展性和可维护性。每个模块负责完成特定的功能,通过接口与其他模块进行交互,从而实现整个系统的功能。模块化是指解决一个复杂问......
  • TypeScript入门5:模块化(导入导出)
    1.概述2.语法3.避免命名冲突4.默认导入导出......
  • python裁切视频后三秒
    代码: importsubprocessfromdatetimeimporttimedeltaimportosdefparse_time(time_str):"""将时间字符串解析为秒"""hours,minutes,seconds=map(int,time_str.split(':'))returntimedelta(hours=hours,minutes......
  • css设置竖向滚动条样式
    divId为div标签的id,内容过多,会出现竖向滚动条。<divid="divId">xxx</div>设置滚动条样式:/*设置滚动条的样式*/#divId::-webkit-scrollbar{width:10px;box-sizing:border-box;}/*滚动条滑块*/#divId::-webkit-scrollbar-thumb{height:5px;......