DDD架构中的领域是什么?


​ 我们经常说到DDD分层架构(领域驱动设计),那么究竟什么是DDD架构?如果去网上查通常会告诉你告诉你区别于过去的三层架构思想,DDD(领域驱动设计)是一种四层架构,一般网上给出的就是用户接口层、应用层、领域层、基础层。而当你真正开始看的时候发现通篇文章中会反复出现领域这个词,而领域究竟是什么?却又很少有人能去解释或者说无法解释

1、浅谈领域一词

​ 领域一词在不同人不同行业中都有不同的理解。中文中【领域】有生物学概念、数学概念等多重意义。出自闻一多《文学的历史动向》:“诗,不但支配了整个文学领域,还影响了造型艺术。” 对它的解释有:具体指一种特定的范围或区域、一国主权所达之地、一种专门活动或事业的范围、部类或部门。那么根据字面意思来看,无论何种解释,它指的都是一个范围一个区域。

2、面向对象谈领域

​ 1、现在的编码都由原来的面向过程编程变成了面向对象编程

​ 2、既然我们是谈DDD(领域驱动设计),那么就得先知道DDD(领域驱动设计)的大概思想,这里先不多做解释,在DDD设计模型中,领域的核心思想是业务

​ 通过以上两点我们得到了我们是面向对象编程,我们的DDD(领域驱动设计)领域核心是业务。那么对象和领域又是什么样的关系呢?

​ 我们都知道代码中有一种思想叫做抽象,而抽象就是把现实中真实存在的一些人、物或者事等等使用抽象化的代码来表示,对于抽象出来的代码我们用一个类表示,这个类有自己的属性有自己的操作,而这个类就是一个对象,我们又叫做实体

​ 我们之前说了,领域就是一个范围,在面向对象编程中,一个领域就是多个相同实体的集合,是一个一对多的关系,从多个相似实体抽象出共同特征得到一个领域

3、领域的划分

​ 领域划分的主要思想是从需求出发,通过需求先划分实体。通过上面我们知道领域是多个实体的集合,那么再通过实体划分领域。这样一来我们包含的层级结构一下就出来了,具体我们以一个商城的案例分析一下

​ 1、首先我们对需求进行深度分析,商城一般包含有订单实体、订单详情实体、营销活动实体、营销工具实体等等

​ 2、接下来我们需要对所有实体按照职责相似度,对实体进行归类,每一类我们取一个新的名字,这就是领域。比如我们的订单实体和订单详情实体都是在交易的时候需要的,而营销活动和营销工具都是做推广的,那么我们分别为其取名为交易域和推广域。这也体现了我们之前所说的领域和实体一对多的关系

​ 虽然只有两个步骤,但是具体的分析却是要慎之又慎,如果当碰到一个新的实体就划分为一个新的域,那么你会恐怖的发现自己的域会越来越多,这个时候对于未来的业务上又会出现越来越多的高耦合场景。所以对于抽象出域的标准和规范需要根据具体业务场景进行深度分析之后划分。切忌:以场景来划分领域,我们应该以业务对象聚合来划分领域

​ 领域划分的原则就是按照实体的职责相似度来划分,领域之间的边界明显清晰。而这就是为了达到领域的高内聚低耦合。最大程度上做到相似的领域聚集在一起,无相似度的领域之间最好是隔离的、耦合度很低的,这样更加有利于业务的稳定和扩展。

4、回顾

​ 以上讲解的就是我们DDD(领域驱动设计)中的领域和领域划分,具体我们划分了领域有什么作用,在DDD(领域驱动设计)中怎么去使用这种划分,我们在下一篇中再慢慢谈

DDD架构中的领域是什么?的更多相关文章

  1. 关于领域驱动设计(DDD)中聚合设计的一些思考

    关于DDD的理论知识总结,可参考这篇文章. DDD社区官网上一篇关于聚合设计的几个原则的简单讨论: 文章地址:http://dddcommunity.org/library/vernon_2011/, ...

  2. 分享一个CQRS/ES架构中基于写文件的EventStore的设计思路

    最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event Sourcing这种架构,我博客 ...

  3. DDD~概念中的DDD(转)

    概念中的DDD DDD: 领域驱动设计,它是对面向对象的的分析和设计(OOAD,Object Orient Analysis Design)的一个补充,对技术框架进行了分层规划,同时对每个类进行了策略 ...

  4. DDD(Domain Driver Designer) 领域驱动设计简介

    领域驱动设计之领域模型 加一个导航,关于如何设计聚合的详细思考,见这篇文章. 2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity i ...

  5. ASP.NET Core Web API下事件驱动型架构的实现(四):CQRS架构中聚合与聚合根的实现

    在前面两篇文章中,我详细介绍了基本事件系统的实现,包括事件派发和订阅.通过事件处理器执行上下文来解决对象生命周期问题,以及一个基于RabbitMQ的事件总线的实现.接下来对于事件驱动型架构的讨论,就需 ...

  6. MVC架构中的Repository模式 个人理解

    关于MVC架构中的Repository模式   个人理解:Repository是一个独立的层,介于领域层与数据映射层(数据访问层)之间.它的存在让领域层感觉不到数据访问层的存在,它提供一个类似集合的接 ...

  7. InfoQ 趋势报告:架构和设计领域技术演变详解

    https://www.infoq.cn/article/R7lWXd0R4VFf3E0bB*38 本文概述了我们对当前“架构和设计”领域的看法,这个领域侧重于基础设施模式.技术框架模式的实现,以及软 ...

  8. NET Core Web API下事件驱动型架构CQRS架构中聚合与聚合根的实现

    NET Core Web API下事件驱动型架构在前面两篇文章中,我详细介绍了基本事件系统的实现,包括事件派发和订阅.通过事件处理器执行上下文来解决对象生命周期问题,以及一个基于RabbitMQ的事件 ...

  9. ddd 架构设计——abp

    一.为什么要分层 分层架构是所有架构的鼻祖,分层的作用就是隔离,不过,我们有时候有个误解,就是把层和程序集对应起来,就比如简单三层架构中,在你的解决方案中,一般会有三个程序集项目:XXUI.dll.X ...

  10. 单元测试布道二:在全新的 DDD 架构上进行单元测试

    目录 回顾 dotnet 单元测试相关的工具和知识 可测试性 不确定性/未决行为 依赖于实现:不可 mock 复杂继承/高耦合代码:测试困难 实战:在全新的 DDD 架构上进行单元测试 需求-迭代1: ...

随机推荐

  1. 在Unity3D中开发的Ghost Shader

    SwordMaster Ghost Shader 特点 此Shader是顶点片元Shader,由本人手动编写完成 此Shader已经在移动设备真机上进行过测试,可以直接应用到您的项目中 所支持的Uni ...

  2. Apple Sources

    1. libsystem_malloc.dylib的源码 https://opensource.apple.com/tarballs/libmalloc/ .这里有多个版本(例如用otool找到iOS ...

  3. kubectl使用方法及常用命令小结

    Kubectl 是一个命令行接口,用于对 Kubernetes 集群运行命令.kubectl 在 $HOME/.kube 目录中寻找一个名为 config 的文件. kubectl安装方法详见:htt ...

  4. Jetpack Compose 加载 Drawable

    Drawable Painter A library which provides a way to use Android drawables as Jetpack Compose Painters ...

  5. @Transactional详细介绍

    @Transactional在设置的时候有以下几个主要属性可以设置, 1.propagation:分别为事务的传播行为; 2.isolation:事务的隔离级别; 3.readOnly读写事务控制; ...

  6. uniapp中使用echarts关系图

    首先看一下页面效果: <template> <view class="page"> <!-- 导航栏 --> <b-nav-bar cla ...

  7. 云服务器搭建redis主从复制以及哨兵模式(附踩坑记录)

    云服务器搭建redis主从复制以及哨兵模式(附踩坑记录) 踩坑记录见最后 搭建一主两从: 在根目录下任意新建一个目录/myredis来存放配置文件: 将我们常用的redis.conf文件拷贝到该目录下 ...

  8. XDZX2022学生博客链接

    王桐林博客        https://www.cnblogs.com/xdzxtong/ 邢沐辰博客 https://www.cnblogs.com/xdzxmuchen/ 袁 博博客 https ...

  9. ios底部安全距离

    一.使用背景 苹果官方推荐:使用env(),constant()来适配,env()和constant(),是IOS11新增特性,用于设定安全区域与边界的距离 safe-area-inset-left: ...

  10. 跨域获取iframe页面的url

    一:跨域获取iframe页面的url 1.在使用iframe页面的js添加以下内容 <script> var host = window.location.href; var histor ...