我们常会使用业务性质来界定领域范围(Bounded Context),例如,采购、销售、库存、运输、会计...等,一般而言,这并没有问题,但是,回到中台架构的理念,我们希望透过共享架构的建立,达到复用(Reuse)的能力,因此,以业务性质界定领域范围後,应该进一步进行水平整合,将共有的功能独立出来,才能建构共享、复用的平台。
企业资源有限,开发团队可能无法在短时间内满足所有业务需求,因此,必须把领域范围区分为核心域(Core domain)、支撑域(Supporting domain)及通用域(Generic domain),然後把焦点集中在核心域,创造竞争优势,支撑域可以外购或外包,配合公司业务的快速发展,例如,餐饮业可以把外送业务直接委托FoodPanda、Uber...等外送平台,至於通用域就必须慎重考虑,例如,权限控管机制关系到单一登入(Single Sign-On, SSO)的重大决策,又客户管理领域牵涉到各部门,如何方便共享并兼顾隐私权的维护,不管是外购或自建,都必须考虑到战略资讯系统的长远规划。以产物保险系统为例,可以作以下的切割:
图一. 产物保险系统子领域的切割
DDD 使用 Context Map 界定与外部系统的关联,DDD发明人Eric Evans将关联按控制(Control)与通讯(Communication)的依存度分为九种,如下图:
图二. 系统关联的类型,图片来源:Domain-Driven Design: Strategic Patterns
九种关联模式说明如下:
区分这些模式有点政治化,可能因一方比较强势,就会决定使两个系统的关联模式要采用那一种,不管如何,一但决定了,後续架构及设计就需因应发展。
Eric Evans特别提到旧系统的汰换,不要想一步淘汰旧系统,可以利用防腐层模式接通旧系统,再逐步利用新技术,将旧系统的功能一块一块替换掉,这是一个好主意,可以降低风险。
为了程序容易扩充与维护,通常我们会对系统架构进行分层,不论是 Client/Server、N-Tier、MVC/MVVM...等,都是将程序的使用者介面(UI)、业务逻辑及资料库存取分离,避免单一档案过大,且混在一起很难修改,DDD也不例外,将架构分为四层,如下图:
图三. DDD分层架构,图片来源:Implementing Domain-Driven Design
DDD将中间层分为应用层(Application Layer)及领域层(Domain Layer),领域层包裹领域模型,并将相关业务逻辑涵盖在内,应用层只是薄薄一层,组合相关领域模型,负责安全认证、发送通知、...等事务。另外,DDD强调设计模式(Design Pattern),例如依赖注入(Dependency Injection, DI)可反转图三架构,以宣告式方式产生物件,或是Repository Pattern结合工厂模式(Factory Pattern),可统合一般物件的新增、更新、删除、查询等共通功能,避免每个类别重复撰写类似的程序码。
完整的架构可参考下图:
图四. 详细的DDD分层架构,图片来源:一文解析DDD中台和微服务设计
由上介绍,战略设计(Strategic Design)相当於架构规划,良好的规划是专案成功的第一步,规划的初衷永远不要忘记:
不要以职场政治为唯一考量。
<<: AI ninja project [day 26] QLattice -- 基础回归
>>: Day11 NiFi & NiFi Registry
在提到MSSQL前,我们要先有对资料库的一些基本概念。 何谓资料库? 资料库就是储存资料的地方。但比...
昨天所说的(Get)主要用於取得api的资料,像是昨天https://jsonplaceholder...
好像很多人对工程师的想像都是埋首写程序, 不用讲话,写程序就好了~ 但其实前端工程师真的不是只有写程...
启动 Angular 开发服务器 我们先打开 VS Code 的终端机面版,输入 npm start...
前言 我们已经将第一个Section下的Cell设置完毕了,接下来马上来实作第二个Section的C...