不合于其它的架构办法,范畴驱动设计DDD(Domain Driven Design)提出了大年夜营业设计到代码实现一致性的请求,不再对分析模型和实现模型进行区分。也就是说大年夜代码的构造中我们可以直接懂得营业的设计,定名合适的话,非法度榜样人员也可以“读”代码。
然而在全部DDD的建模过程中,我们更多存眷的是核心范畴模型的建立,我们认为完成营业的需求就是在范畴模型上的一系列操作(应用)。这些操作包含了对核心实体状况的改变,范畴事宜的存储,范畴办事的调用等。在优胜的范畴模型之上,实现这些应用应当是轻松而高兴的。
笔者经历过很多次DDD的建模工作坊,在经历了数天一轮又一轮激烈评论辩论和不厌其烦的核阅之后,大年夜家欣慰地看着白板上各类色彩纸贴所展示出来的范畴模型,成就感写满大年夜家的脸庞。就在这个大年夜功告成的时刻,往往会有人问:这个模型我们怎么落地呢?然后大年夜家脸上的愉悦消掉了,换上了对细节就是魔鬼的焦炙。但这是我们弗成避免的实现细节,DDD的原始办法论中固然给出了“分层架构”(Layered Architecture)的元模型,但若何分层却没有明白定义。
分层架构
在DDD办法提出后的数年迈,分层架构的具体实现也经历了几代演进,直到Martin Fowler提炼出下图的分层实现架构后,才慢慢为大年夜家所承认。DDD的办法也获得了有效的弥补,模型落地的问题也变得更轻易,核心范畴模型典范围也做出了比脚绫趋白的定义:包含了Domain,Service Layer和Repositories。
(Martin Fowler总结提出的分层架构实现,留意“Resources”是基于RESTful架构的抽象,我们也可以懂得为更通用的┞冯对外界的接口Interface。而HTTP Client主如果针对互联网的通信协定,Gateways实际才是交换过程中组装信息的逻辑地点。)
我们的核心实体(Entity)和值对象(Value Object)应当在Domain层,定义的范畴办事(Domain Service)在Service Layer,而针对实体和值对象的存储和萌芽逻辑都应当在Repositories层。值得留意的是,不要把Entity的属性和行动分别到Domain和Service两层中去实现,即所谓的贫血模型,事实证实如许的实现方法会造成很大年夜的保护问题。DDD战术建模中的元模型定义不该该在实现过程中被改变,作为元模型中元素之一的实体本身就应当包含针对自身的行动定义。
基于这个模型,下面我们来谈谈更具体的代码构造。对于这个分层架构还有困惑的读者可以精读一下Martin的 原文 。有意思的一点是,这个模型的论述实际是在微办事架构的测试文┞仿中,个中深意值得大年夜家领会。
这里须要明白的是,我们谈论代码构造的时刻,针对的是一个经由DDD建模后的子问题域(拜见计谋设计篇),这是我们明白的组件化界线。是否进一步组件化,比如按照限界高低文(Bounded Context)模块化,或采取微办事架构办事化,核心实体都是进一步可能采取的组件化办法。大年夜抽象层闷匠,老马提炼的分层架构实用于面向营业的办事化架构,所以如不雅要进一步组件化也是可以按照这个代码构造来完成的。
- TEST(bc_demo_test, create_cargo)
- {
- api::CreateCargoMsg* msg = new api::CreateCargoMsg();
- msg->Id = ID;
- msg->AfterDays = AFTER_DAYS;
- createCargo(msg);
- EXPECT_EQ(msg->Id, provider->cargo_id);
- EXPECT_EQ(msg->AfterDays, provider->after_days);
- }
总体的代码目次构造如下:
- - DDD-Sample/src/
- domain
- gateways
- interface
- repositories
- services
这个目次构造一一对应了前文的分层架构图。完全的案例代码请大年夜GitHub 下载 。
可以看到实际上我们并没有建立外部存储(Data Mappers/ORM)和对外通信(HTTP Client)的目次。大年夜范畴模型和应用的角度,这两者都是我们不必关怀的,可以或许验证全部范畴模型的输入和输出就足够了。至于什么样的外部存储和外部通信机制是可以被“注入”的。如许的隔离是实现可自力安排办事的基本,也是我们可以或许测试范畴模型实现的请求。
下面是别的一个测试推迟delay的场景,同样我们看到了驱动出的Api::Delay的实现。
推荐阅读
知道什么时刻做什么 【编辑推荐】JetBrains 的 Go 集成开辟情况已肯定最终名称:GoLandJDK 10 早期试用版宣布,Java 开辟对象包高等码农进步90%开辟效力的对象推荐晋升Web开辟机能的10个技>>>详细阅读
本文标题:DDD实战篇:分层架构的代码结构
地址:http://www.17bianji.com/lsqh/38634.html
1/2 1