DDD-领域驱动设计入门

领域驱动设计概述 Domain driven design summary

DDD(Domain Driven Design)
即领域驱动设计,核心是不断提炼通用语言并用于与领域专家等团队所有成员交流,并用代码来表达出一个与通用语言一致的领域模型。

背景
这些年随着设备以及技术的发展,软件架构发生了很多变化,从最初的单机(BS/CS)架构到后面的集中式架构,再到如今的微服务架构, 现在基本可以说是微服务架构盛行的时代,DDD早在2004年就由埃里克·埃文斯提出,但一直处于一个不愠不火的状态,直到Martin Fowler的《Microservices》引起大家注意,也就是微服务盛行之后(这儿需要说明的是,微服务最早的提出者不是Martin Fowler,而是Fred George),DDD再次回到人们视野中间

在这里插入图片描述
领域DOMAIN: 软件系统要解决的问题域,是有边界的。领域一般包含多个子域,子域根据其功能划分为核心域、通用域、支撑域。

限界上下文BOUNDED CONTEXT:描述领域边界,一个限界上下文可能包含多个子域,但一般实践上都以一对一为好。应用单元和部署单元一般也与限界上下文一致。

领域模型DOMAIN MODEL:对我们软件系统中要解决问题的抽象表达(解决方案)。模型一般在一个限界上下文中有效。

限界上下文映射BOUNDED CONTEXT MAPPING:多个上下文之间如何进展系统交互集成。

在这里插入图片描述

  • 聚合根
  • 实体
  • 值对象
  • 领域事件
  • 仓储定义
  • 领域服务
  • 工厂
  • 限界上下文映射的反腐层定义

分层架构与六边形架构 Hierarchical and hexagonal

分层分包:
复杂是我们软件生涯的一生之敌。

分层是除“模块化”之外最古老的架构模式,冯诺依曼计算机模型是模块化的架构,但同时计算机世界也是层层叠加的。分层分包的本质就是隔离,人处理难题的能力是有限的,无法同时处理很多复杂的事情,所以不把所有东西都放在同一层次,譬如行政体系也是分层的。隔离使得各个层次职责更清晰,更容易管理。

分层的原则是只能上层调用下层,而不能反过来,反之容易导致循环依赖。分包的原则是,同一个包中的对象天然是亲和的,同时对包外的对象是不亲和(隔离)的。

分层架构 & 面向过程设计 - MVC

  1. 包划分:所有model放一个包,所有service放一个包,所有mapper放一个包。
  2. 服务依赖:SpuController -> SpuService -> SpuMapper -> Mybatis
  3. 创建时数据流向:SpuDTO -> SpuDO -> Table
  4. 失血模型:只包含字段,和get/set方法,SpuDO本身无法执行任何行为

缺点:
一个服务方法几乎包含了所有的逻辑,负责校验、获取外部信息、组装、转换SpuDTO为SpuDO、并调用SpuMapper保存到数据库,SpuDO为失血模型。
耦合性强,在各种service(如MaterialService,CategoryService)内部注入,重构/扩展性差。

优点:
在逻辑很简单场景下,crud迭代最快。 MVC保证了代码最差也差不到哪去(基本总是最差)

六边形架构 & 面向对象设计 - DDD

  1. 包划分:以业务划分包,同业务的identity、valueObject、event、repository、service等放在一个包下。
  2. 服务依赖:SpuService只是调用领域服务和仓储等来串流程,不包含业务逻辑,如校验等。
  3. 分治:采用分治法,将数据、约束、行为等划分到最能表达它的领域模型中。
  4. 充血模型:包含字段和行为,如校验在构造和set时内置,方法体现业务操作如changeName,不是单一的update动作。

优缺点:
DDD如果做的差,会比MVC还要差,如果做的好,的确可以应对业务的变化(了解业务,预测业务的变化)。
业务逻辑清晰度高。
防腐层隔离变化。
充血模型扩展性高(当MVC耦合成一团💩山的时候,还敢随便改SpuDO的信息吗?除非读懂每一个Service的调用过程)
各领域自治,可以自我发展。

在这里插入图片描述
在这里插入图片描述
六边形架构又称“端口和适配器模式”,是计算机博士Alistair Cockburn提出的一种具有对称性特征的架构风格。
在这种架构中,系统通过适配器的方式与外部交互,将应用服务于领域服务封装在系统内部。

代码分享 Code Sharing

在这里插入图片描述
包划分
gate: 对外暴露的服务
rest:对外暴露的rest服务
application:应用服务层
domain:领域层
category: 分类
unit: 单位
sku: 规格
spu: 商品库
infra:基础设施层
repo:仓储实现
mapper: 数据库交互

探讨Discuss

如何判断一个项目是否需要用DDD?

业务:快速变化
需求变更快,需求迭代快,业务扩展快的项目。

开发人员:3-5年经验
需要熟练应用过很多设计模式,有了这些经验才能理解为什么这么设计,才能不偷懒的去做这件事,否则很容易对领域造成污染。

时间:充分
需要有充分的时间去划分业务,设计领域,需要更多的类,编写更多代码量。

by:9月9日 - 高世庆 - DDD驱动开发设计,商派内部技术分享会

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法论,旨在解决复杂业务领域的软件开发问题。它强调将业务领域的知识和概念直接融入到软件设计和开发中,以实现更好的业务价值和可维护性。 在C#中实施DDD时,可以采用以下几个关键概念和技术: 1. 领域模型(Domain Model):领域模型是DDD的核心概念,它是对业务领域的抽象和建模。在C#中,可以使用类和对象来表示领域模型,通过定义实体(Entity)、值对象(Value Object)、聚合根(Aggregate Root)等概念来描述业务领域中的实体和关系。 2. 领域驱动设计的分层架构:DDD通常采用分层架构来组织代码。常见的分层包括用户界面层(UI)、应用服务层(Application Service)、领域层(Domain Layer)、基础设施层(Infrastructure Layer)等。每一层都有不同的职责和关注点,通过良好的分层设计可以实现代码的可维护性和可测试性。 3. 聚合根和聚合:聚合根是DDD中的一个重要概念,它是一组相关对象的根实体,通过聚合根可以保证一致性和边界。在C#中,可以使用类来表示聚合根,通过定义聚合根的行为和关联关系来实现业务逻辑。 4. 领域事件(Domain Event):领域事件是DDD中用于描述领域中发生的重要事情的概念。在C#中,可以使用事件(Event)或委托(Delegate)来表示领域事件,并通过事件驱动的方式来处理领域事件。 5. 仓储(Repository):仓储是用于持久化和检索领域对象的接口或类。在C#中,可以使用接口和实现类来定义仓储,并通过依赖注入等方式将仓储注入到其他类中。 6. 领域服务(Domain Service):领域服务是一种用于处理领域逻辑的服务。在C#中,可以使用类和方法来表示领域服务,并将其注入到其他类中使用。 以上是DDD领域驱动设计在C#中的一些关键概念和技术。通过合理运用这些概念和技术,可以更好地实现复杂业务领域的软件开发

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值