断断续续的也有在闲余时间接触领域驱动设计的相关知识,因为目前在工作中更多的还只是一名 crud boy,因此目前也只是对其中的某些知识点有知晓,实际使用的比较少,仅此而已。因此,趁着这个春节假期,整理了一下自己的 github 帐号,同时结合自己定的学习计划以及自己的期望发展方向,决定从一个真实的案例来梳理领域驱动的相关知识。
本篇文章是开篇,因为领域驱动设计相关的知识真的不怎么好懂,如果行文中出现错误的地方,欢迎大家在评论区指出,先行感谢。
当然,talk is cheap, show me the code,作为一名 .NET 开发人员,实例中的服务端代码全部是基于 ASP.NET Core 框架进行搭建的。
二、系列目录
三、Step by Step
不清楚大家在接触领域驱动的相关知识时,是不是一上来就是领域驱动经典的四层架构,然后什么是实体、值对象、聚合,它们之间有什么异同以及与传统的开发模式又是什么,领域模型又是什么东东,最终接触到一大堆的概念,结合上网搜到的示例项目代码,结果最后就知道了几个名词。
当然,这些都是领域驱动设计中比较重要的知识点,可能是自己入行较短,按照上面的这个顺序看了一遍,看完之后,嗯,貌似最后都没看完,我只能是下面的这种表情。。。因此,为了不让像我这样的小白用户一上来就用药过猛,所以这里我换一种方式来尝试解释我所认为的领域驱动设计,如若存在偏差,希望可以帮忙指出。
第一篇介绍的是我认为领域驱动设计中一个最基础的东西,也是很多文章中并没有说的,如何去识别出业务领域并进行划分。
1、案例分析因为在识别领域时,需要做到对于业务流程有比较深刻的了解,至少应该做到有相关软件的使用经历,因此在这个系列的文章中,我选择的是项目管理软件作为文章的示例项目。最终实现的各种需求是基于禅道项目管理软件这个开源项目的,因此,在开发这个项目之前,我们可以先看看禅道这个项目管理系统中所包含的功能模块。毕竟,只有在了解需求之后才好进行下一步的工作。
在这个开源的项目管理系统中,主要包含了如下的几个功能。
除了一些基础的权限相关功能,站在项目产品的角度,禅道包含了对于产品的分支、团队成员、迭代版本、功能模块、功能需求等数据信息的维护,同时针对项目可以去设定各种任务、以及可以提 bug 等等任务操作。
当然,系统所包含的功能还可以继续往下展,如果按照我们面向数据库开发的经验,在弄清楚系统的各项功能后,可能就是去建各种的表了,继而识别出各个表之间的关联关系,然后就 ctrl c、ctrl v 的开干了。当然,这里既然选择采用一种新的方式进行开发,忘掉我们原来的经验,从一个新的角度开始。
2、领域划分领域驱动设计,在维基百科中对于领域的解释如下,因为词条的中文解释应该是机翻的,所以这里放出英文原文,下方的中文是我基于个人理解所提供的翻译,仅供参考。
A sphere of knowledge (ontology), influence, or activity. The subject area to which the user applies a program is the domain of the software;
领域是一种关于知识、影响或是活动的范围限定。软件的领域是用户想要通过使用该程序所要达到的主体功能。
范围,即是边界,能够置于相同范围内的事物必定是具有着某种相同的特性,我们通过代码的手段来解决现实中的问题时,也会将某些共通的业务放到一块。
因此,在使用领域驱动的思想来指导软件开发的过程中,我们需要按照一定的业务规则将期望达成的业务进行细分,在最终划分出的一个个小业务范围内,通过建立领域模型的方式,指导代码实现,从而解决具有共同特性的问题,因此,领域驱动设计中的领域就是这个业务边界范围内想要解决的业务问题域。
接下来,针对我们期望实现的项目管理系统,就是需要按照一定的业务规则,完成我们的业务领域的划分。
第一步:确定研究对象,明确我们将要研究的业务领域,识别出最终需要解决的业务问题;
我们最终想要实现的目标是一个项目管理系统,因此这里我们的研究对象就是项目管理。
第二步:对研究对象按照一定的业务逻辑进行细分,将领域进一步的划分成多个子领域;