DDD理论学习系列(13)– 模块

DDD理论学习系列(13)– 模块"DDD理论学习系列——案例及目录"1.引言Module,即模块,是指提供特定功能的相对独立的单元。提到模块,你肯定就会想到模块化设计思想,也就是功能的分解和组合。对于简单问

大家好,又见面了,我是你们的朋友全栈君。

DDD理论学习系列——案例及目录


1. 引言

Module,即模块,是指提供特定功能的相对独立的单元。提到模块,你肯定就会想到模块化设计思想,也就是功能的分解和组合。对于简单问题,可以直接构建单一模块的程序。而对于复杂问题,则可以先创建若干个较小的模块,然后将它们组装、链接在一起,从而构成复杂的软件系统。

在DDD中,模块的用途也是如此,通过分解领域模型为不同的模块,以降低领域模型的复杂性,提高领域模型的可读性。

2. DDD中的模块

模块是一个笼统的概念,比较宽泛,为了正确发挥模块的威力,理解模块的概念就十分重要。下面我们从具体的问题着手,来尝试说明模块的概念。

如何对在线商城的顾客进行建模?

对于顾客来说,一般需要维护顾客的个人信息、收货地址、支付方式。这些信息是紧密相关的,不可独立存在。我们可以抽象出三个简单的聚合CustomerAddressBookWallet。那这些类该如何存放呢?是为每一个聚合创建一个文件夹存放还是放在同一个文件夹?我想答案不言而喻。
这三个聚合就是一个模块,一个客户模块。通过定义一个Customer文件夹,来将相关联的领域对象组合起来。而这个文件夹体现在C#中就是命名空间的概念。
顾客模块

再来看一个问题,如何设计在线商城的支付功能?

支付是在线商城中十分重要的一个环节,设计的好坏直接影响项目的成败。一般来说,针对于支付环节,我们应该单独放到支付子域中去处理,以维护领域的不变性,支付环节对应支付上下文,在支付上下文下,一些领域概念才能更清晰。为了提升支付体验,我们势必要支持多种支付方式,比如支付宝支付、微信支付、其他银行卡支付。在对接某一种支付方式时,我们就应该为其定义单独的模块,保证支付方式的独立性。同样,我们可以选择通过命名空间来实现模块化,也可以类似NopCommerce创建单独的项目来插件化开发集成每一种支付方式。同样,我们也可以将整个支付功能拧出一个单独的支付模块,以便在其他项目中进行共用。

如何集成第三方SDK?

我们知道开源的一大好处是,大牛们分享了一系列高效、实用库或软件,也就是大家常说的“轮子”,比如Hangfire、RabbitMQ、Dapper、Redis等等,我们可以直接开箱即用。但如果项目中集成很多的第三方SDK,如果不加以组织整理,项目的结构就会比较混乱,代码的可读性就大大降低。这个时候我们就可以考虑模块化的去集成第三方SDK,通过对第三方SDK的再封装,来完善代码的组织结构,以达到项目中的统一调用。Abp框架就是通过这种方式来集成比较流行第三方SDK。

Abp框架的模块化集成

通过以上的举例说明,我们可以看到模块可大可小,每个模块都是相对独立的功能单元。在C#中我们可以用命名空间或单独的项目来实现模块。通过模块来组织和封装相关概念,来分解领域模型,以简化领域模型的复杂性。

但不要将模块与子域和限界上下文混淆。在复杂的领域模型中,为了对领域模型中进行准确建模,需要将领域模型拆分成多个子域,每个子域对应一个或多个限界上下文。在限界上下文中,可以将限界上下文中具体的领域概念分解成不同的模块。所以,从子域到限界上下文再到模块,应该是依次包含关系。
模块的位置

3. 模块设计的原则

模块的设计是基于领域模型的,要符合通用语言的表述。其次,模块的设计要符合高内聚低耦合的设计思想。

3.1. 根据领域来组织模块

模块应该由领域的概念来组织,而不是根据通用的组件类型和模式来创建模块。如果将所有的聚合、服务、工厂分别放在独立的模块中,就会有悖于DDD的设计原则,同时还会限制我们创建富有行为的领域模型。这样设计的模块的关注点是在当前的组件和模式上,而不是在领域上。每个模块都应该有适当的类来建模领域的特定方面的概念和功能。

3.2. 基于通用语言

项目中的通用语言除了用来指导实体,值对象、领域服务和领域事件的的命名外,也适用于模块的命名。使用通用语言来为模块命名,可以清晰的反映领域中的概念,且能够明确模块职责。例如,领域中身份认证的概念,我们就可以以Identity来命名这个模块。

推荐的模块命名规范是:公司名称.项目名称.架构分层.限界上下文.组件类型
比如对腾讯微信产品的朋友圈模块的领域层可以按以下方式命名:

Tencent.Weixin.Domain.Moment.Models 
Tencent.Weixin.Domain.Moment.Repositories
Tencent.Weixin.Domain.Moment.Services
Tencent.Weixin.Domain.Moment.Factories

说到这里,你可能会想到mvc的项目结构也是基于模块的思想,比如Models、Views、Controllers、css、js都是放在独立的文件夹中,这其实也是关注点分离的思想,通过模块的分割来达到关注点分离。

3.3. 高内聚低耦合

高内聚低耦合是模块设计的重要思想,模块内高内聚,模块间低耦合。
一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分,这样有利于修改和组合。

4. 总结

模块是对领域模型进行分解后的产物,是相对独立的功能单元,由一系列高内聚的领域对象组成,相对聚合、实体和值对象来说是更高一层的抽象。

模块化的思想大大简化了领域模型的复杂性,即便于我们设计出高内聚低耦合的系统,也便于我们理解系统的设计。

而至于模块的实现,我们既可以通过命名空间来进行分离,也可以使用单独的项目来实现。

参考资料

What are Modules in Domain Driven Design?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155610.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • repos_there are no enabled repos

    repos_there are no enabled repos配置Base源,使用163或者阿里的1、mirrors.163.com/2、mirrors.aliyun.com/or https://developer.aliyun.com/mir

    2022年8月4日
    7
  • 客服客户聊天系统源码分享[通俗易懂]

    客服客户聊天系统源码分享[通俗易懂]静态H5聊天对话框html源码客服系统代码(3)此程序可用作客户与客服聊天使用,也可以作为app程序嵌入的聊天功能或者站内聊天使用的代码。运行视频效果:链接:https://pan.baidu.com/s/1lMbXgY3rVRw4ZFfwePJOTw提取码:bfyh复制这段内容后打开百度网盘手机App,操作更方便哦静态H5聊天输入对话框html代码(1)静态H5聊天输入对话框html代码(2)上节讲了消息对话如何实现,上节规划中是来如何实现做到推送实时刷新,看了ba.

    2025年11月26日
    2
  • 【PMP】PMBOK第六版项目管理5大过程组10大知识领域知识点汇总

    前后准备考试,历时一个月时间,最终完美pass第一章项目管理框架第二章、项目运行环境第三章项目经理的角色第四章、项目整合管理第五章项目范围管理第六章项目进度管理第七章项目成本管理第八章、项目质量管理第九章、项目资源管理第十章项目沟通管理第十一章项目风险管理第十二章、项目采购管理第十三章、项目相关方管理必须记住的知识点:规划成…

    2022年4月8日
    44
  • Qtum量子链新官网全面升级,正式上线!

    Qtum量子链新官网全面升级,正式上线!

    2021年6月19日
    105
  • oracle 11g 安装闪退问题[通俗易懂]

    oracle 11g 安装闪退问题[通俗易懂]oracle安装时闪退问题今天碰到一个很奇怪的问题,在安装oralce11g时奇怪闪退,本地安装好好的,到服务器安装oralce就闪退,这个时候不要慌,先看看错误日志路径默认都会在C盘,这个是安装的日志C:\Users\用户名\AppData\Local\Temp\OraInstall2021-04-30_04-44-48PMUsingparamFile:C:\database\install\oraparam.iniCheckingmonitor:mustbec

    2022年7月25日
    120
  • sklearn安装教程_cmd安装软件命令

    sklearn安装教程_cmd安装软件命令sklearn库sklearn是scikit-learn的简称,是一个基于Python的第三方模块。sklearn库集成了一些常用的机器学习方法,在进行机器学习任务时,并不需要实现算法,只需要简单的调用sklearn库中提供的模块就能完成大多数的机器学习任务。sklearn库是在Numpy、Scipy和matplotlib的基础上开发而成的,因此在介绍sklearn的安装前,需要先安装这些依赖库。…

    2022年10月17日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号