首页 > 其他分享 >何为DDD

何为DDD

时间:2023-07-27 19:22:45浏览次数:34  
标签:聚合 何为 实体 业务 领域 订单 DDD 属性

 

  从这一刻开始,请大家忘记自己是一名技术人员,用业务的角度来思考问题。

 

1、什么是DDD

  DDD(Domain-driven design,领域驱动设计),是一个很好的应用于微服务架构的方法论

  DDD要求项目全生命周期中,所有岗位人员都基于业务的角度去思考问题,而不是基于技术角度。

  “从理论到实践,再从实践到理论”——杨中科

2、领域(Domain)

  领域是指一个组织做的全部事情,可分为不同的子领域,子领域可用归为以下三类:

  核心域:解决项目的核心问题,和组织业务密切相关。

  支撑域:解决项目的非核心问题,具有组织特性,但不具有通用性。

  通用域:解决通用问题,没有组织特性。

  领域的不同分类决定了公司的研发重点:

  比如:某软件公司,将领域分为

    

3、领域模型(Domain Model)

  用业务的角度,对领域内的元素进行建模,抽象出来的模型图。

  比如,银行中有:柜员、客户、ATM、保安、取号机...

  识别出这些模型,再用模型描述和构建系统

4、事务脚本

  也可称为:伪代码,以易读性为准,用类似代码的语法表达业务需求,如

string WithdrawMoney(string acc,string pwd,double nums) //取钱
{
    if (!checkUser(acc, pwd))
    {
        return "账户错误";
    }
    double remainingSum = GetRemainingSum(acc); //获取余额
    if(remainingSum< nums)
    {
        return "余额不足";
    }
    UpdateRemainingSum(remainingSum - nums); //更新余额
    return "取款成功";
}

5、通用语音  &   界限上下文

  5.1、通用语音:一个拥有确切含义,没有二义性的语音

    产生二义性的例子:定义一个对象为"用户",这个用户是指柜员、储户、还是客户经理,没有确切定义,这就是二义性

  5.2、界限上下文:通用语音离不开特定的语义环境,只有确定了边界,才能没有歧义的描述一个业务,比如:

    1)后台管理系统用户:是指系统管理员、系统流程人员

    2)官方网站用户:是指储户、信用卡用户

6、实体(Entity) &  值对象(Value Object)

  6.1 实体:可用理解为实体对象,是富有业务行为且具有唯一标识符的对象。在不同的设计阶段实体是可以改变的,但是根据唯一标识符始终能定位到这个唯一对象,如员工(Code:对于员工类)

  6.2 值对象:依附于实体存在,如员工居住地址。(Code:对应地址类)

7、聚合(Aggregate)   &    聚合根

  目的:实现高内聚,低耦合

  7.1 聚合:把关系紧密的实体,放到同一个聚合中,如,订单聚合包含:订单、订单明细

  7.2 聚合根:每个聚合,都有一个聚合根负责和外部对象进行沟通,如:通过订单访问订单明细

  聚合根和聚合内其他实体,体现的是整体和部分的关系,如:订单包含订单明细

  聚合的划分没有标准答案,根据业务进行划分。(Code:完善的划分有利于微服务的构建)

  聚合内的实体:只有对象创建、初始化、状态管理等个体相关代码,没有业务逻辑代码

  订单聚合例子:

         订单聚合:订单(根实体)、订单明细(普通实体)

         创建订单时,控制订单创建、判断订单数量,属于领域服务

         保存订单,属于应用服务

8、领域服务   &   应用服务

  8.1 领域服务:针对聚合内业务逻辑,不会和数据库发生直接交互,在简单的业务中领域服务不是必需的(避免过度设计)

  8.2 应用服务:针对跨聚合协作、聚合与外部系统协作逻辑(协调多个领域服务、外部系统来完成一个用例)

9、DDD典型用例处理流程

  第一步,准备业务操作所需要的数据。

  第二步,执行由一个或者多个领域模型做出的业务操作,这些操作会修改实体店状态,或者生成一些操作结果。

  第三步,把对实体店改变或者操作结果应用于外部系统。

10、仓储(Repository)  &   工作单元(Unit Of Work)

  仓储:读取数据/保存对实体的修改

  工作单元:聚合内的数据操作紧密相关,若干操作组成一个工作单元;

       为保证事务的强一致性,这些操作要么全部成功,要么全部失败(事务)

11、领域事件   &   集成是事件

  领域事件:在同一个微服务内的聚合之间的业务传递,使用进程内的通信机制完成。

  集成是事件:跨微服务的业务传递,使用事件总线(EventBus)实现

12、贫血模型  &  充血模型

  贫血模型:只有属性和成员变量(属性带有get;set;本身并不保存值,值存在生成的隐式私有成员变量中)

  充血模型:属性、成员变量、方法

 13、EFCore框架实现充血模型的五个要求

  1)属性是只读的,或者只能被类内部的代码修改

    实现:将属性的set定义为private或者init,然后通过构造方法为属性赋值

  2)定义有参构造方法,提供给类实例化

    因为EFCore会通过反射直接访问私有属性,实现方式可为:

    方式1:构造方法参数名(首字母小写)必须和属性名一致

    方式2:保留无参构造函数,定义为private,这是给EFCore从数据库加载数据用的

  3)没有定义属性的成员变量也需要映射为数据列,如passWordHash

    没有{get;set;}的是成员变量,也叫做字段,正常为private

    有{get;set;}的为属性,正常为public,(注意很多时候我们不会定义成员变量,系统会自动生成一个)

    实现:builder.Property("成员变量名")

  4)有的属性仅从数据库读,而不写

    EFCode中提供了支持字段"backing field",来支持这种写法

    实现:在配置实体类的代码中,使用builder.Property(e=>e.属性名).HasField("成员变量名")来配置属性为只读

  5)有的属性不需要映射到数据列,仅在运行时被使用

    实现:使用Ignore()来配置忽略

 

 

 

  

  

 

  

  

 

 

 

 

 

 

 

  

标签:聚合,何为,实体,业务,领域,订单,DDD,属性
From: https://www.cnblogs.com/wskxy/p/17238474.html

相关文章

  • pytesseract and ddddocr
    一.pytesseract1.简介 Pytesseract是一个Python库,用于将图像中的文本转换为可编辑的字符串。它是基于Google的TesseractOCR引擎开发的。Tesseract是一个开源的OCR引擎,能够识别超过100种语言的文字。Pytesseract简化了与Tesseract的集成过程,并提供了一个简单的API,使得在Python......
  • DNS解析常见问题:如何为网站配置负载均衡?
    DNS解析常见问题:如何为网站配置负载均衡?早期的互联网应用,由于用户流量比较小,业务逻辑也比较简单,往往一个单服务器就能满足负载需求。随着现在互联网的流量越来越大,系统功能也越来越复杂,单台服务器就算将性能优化得再好,也不足以支撑太大流量的访问压力了,这个时候就需要使用多台机器,......
  • 为什么微服务要选用ddd
    进入微服务架构时代以后,微服务确实也解决了原来采用集中式架构的单体应用的很多问题,比如扩展性、弹性伸缩能力、小规模团队的敏捷开发等等。但在看到这些好处的同时,微服务实践过程中也产生了不少的争论和疑惑:微服务的粒度应该多大呀?微服务到底应该如何拆分和设计呢?微服务的边界应......
  • DDD架构为什么应该首选六边形架构?
    一、传统分层架构分层架构的一个重要原则是:每层只能与位于其下方的层发生耦合。分层架构分两种:一种是严格分层架构,规定某层只能与直接位于其下方的层发生耦合;另一种是松散分层架构,允许任意上方层与任意下方层发生耦合。下图是一个典型的DDD传统分层架构。以上分层架构中各层......
  • 从MVC跨越到DDD微服务架构是如何演进的
    微服务架构演进领域模型中对象的层次从内到外依次是:值对象、实体、聚合和限界上下文。实体或值对象的简单变更,一般不会让领域模型和微服务发生大变。但聚合的重组或拆分却可以。因为聚合内业务功能内聚,能独立完成特定业务。那聚合的重组或拆分,势必引起业务模块和系统功能变化。......
  • 一文了解DDD分层架构演进
    1.3分层架构演进1.3.1传统四层架构将领域模型和业务逻辑分离出来,并减少对基础设施、用户界面甚至应用层逻辑的依赖,因为它们不属业务逻辑。将一个夏杂的系统分为不同的层,每层都应该具有良好的内聚性,并且只依赖于比其自身更低的层。传统分层架构的基础设施层位于底层,持久化和......
  • DDD邻域驱动设计的基础理解
    ddd认为在application到infra层应该加一层domain业务逻辑因该分为两大类,核心业务相似的,固定不变的应该放在domain这一层application用来接入不同的应用场合会产生的不同业务逻辑比如用户从网络端接入和从手机端接入,可能不同比如用户登录网站和店家登录网站,逻辑也不同applicat......
  • 如何为odoo15网站应用添加域名以及邮箱设置
    如何为odoo15网站应用添加域名以及邮箱设置1.内容介绍odoo在服务器上安装好后,是通过IP地址加端口的方式访问的(例如:http://43.159.48.232:8069/)。实际应用的时候,IP地址和端口不好记。同时网站的功能也得需要一个网站地址。这篇文章主要介绍步骤就是通过安装Nginx,启用SSL并设置......
  • hao123ddddddddppppppppppp
    1,youduoshaoshangjia,就有多少dp(xinyuduwangzhan)!   1.1shangguonideshangjia。  1.2bangzhuguonideshangjia   1.3 daiyuzuihaodeqiye   1.4监督来源人们,互帮互助。  2013.1.4  loveforever!......
  • 肝货!万字长文助你上手DDD
    导语最近看了一本书《解构-领域驱动设计》,书中提出了领域驱动设计统一过程(DDDRUP),它指明了实践DDD的具体步骤,并很好地串联了各种概念、模式和思想。因此,我对书本内容做了梳理、简化,融入自己的理解,并结合之前阅读的书籍以及实践经验,最终形成这篇文章。希望可以帮助大伙理顺DDD的各种......