一、为什么要使用领域模型
• 有助于团队创建一个业务部门与IT部门都能理解的通用模型,并用该模型来沟通业务需求、数据实体、过程模型。
• 模型是模块化、可扩展、易于维护的,同时设计还反映了业务模型。
• 提高了业务领域对象的可重用性和可测性。
二、领域的分层架构
在Eric Evans《领域驱动设计--软件核心复杂性应对之道》中对领域的分层架构如下:
• 用户界面(表现层):负责给用户展示信息,并解释用户命令。
• 应用层:该层协调应用程序的活动。不包括任何业务逻辑,不保存业务对象的状态,但能保存应用程序任务过程的状态。
• 领域层:这一层包括业务领域的信息。业务对象的状态在这里保存。业务对象的持久化和它们的状态可能会委托给基础设施层。
• 基础设施层:对其它层来说,这一层是一个支持性的库。它提供层之间的信息传递,实现业务对象的持久化,包含对用户界面层的支持性库等。
三、如何创建领域模型
• 寻找概念类
• 将其绘制为UML类图中的类
• 添加关联和属性
四、领域模型的开发步骤
• 对领域进行建模
• 设计
• 开发
• 单元测试和集成测试
• 基于设计和开发来完善、重构领域模型
• 使用更新的领域模型重复上述步骤
五、实际项目设计
1、层次结构:
2、层次之间的交互
A、页面提交表单数据到Action,Action创建DTO对象并设置相应属性值为表单数据
B、Action传递DTO对象给Facade
C、Facade中套用ServiceTemplate事务模板以加入事务管理,在ServiceTemplate中根据具体业务调用Factory或Reposistory,分别create或者load出DomainModel对象
D、Facade传递DomainModel对象给Service
E、Service执行具体业务逻辑(调用DomainModel对象相应的业务方法)
F、Service调用Reposistory对状态已改变的DomainModel对象进行持久化操作(调用相应DAO)
注:
在Facade或Service中如果需要查询DomainModel对象中的属性值,调用DomainModel对象的getDataInfo()方法得到DataInfo对象,通过DataInfo对象查询所需数据,包括Service返回给Façade业务处理结果中所包含的业务数据。
3、对于DomainModel的设计
DomainModel基于贫血模型来设计。在Robbin《总结一下最近关于domain object以及相关的讨论》一文对于贫血模型领域的切分原则写到:
引用
Rod Johnson提出原则是“case by case”,可重用度高的,和domain object状态密切关联的放在Item中,可重用度低的,和domain object状态没有密切关联的放在ItemManager中。
我提出的原则是:看业务方法是否显式的依赖持久化。
在该项目中DomainModel内的业务逻辑方法没有任何对DAO接口的依赖,如果需要对DomainModel进行持久化操作全部由Service调用Reposistory的store()方法进行处理,对DomainModel的持久化操作已全部封装于Reposistory中。DomainModel只提供改变自身状态的业务处理方法。
4、对DomainModel的访问原则
A、必须从领域模型的根部操作模型的各个属性
例如一个领域模型结构如下:
public class PersonDomainModel {
Person person;
Bank bank;
public void modifyPerson(String name, String age) {
this.person.setName(name);
this.person.setAge(age);
}
}
操作该领域模型的person属性只能通过modifyPerson()方法进行,而不能直接调用person对象的setter方法。
B、必须保持领域模型的完整性。最初由Factory构造一个模型的时候,就必须将其进行完整的初始化,而不是只构造一部分,然后在接下来的处理过程中逐步完善。
5、Factory和Reposistory的职责
Factory只负责领域模型对象的创建(从无到有);
Reposistory对持久化进行了封装,它操作的是已存在的领域模型对象(从数据库中读取数据or重新持久化到数据库)
6、项目待优化部分
在Service调用Reposistory的store()方法进行持久化操作时,如果某个业务仅对DomainModel的一部分属性进行了修改,在持久化到数据库中时仍然会将DomainModel的所有属性全部进行一次update操作。这样的数据库操作没有必要,只需对DomianModel中修改过的属性进行持久化操作即可。可以考虑在DomainModel上提供一个类似保存所有修改属性的列表,在Reposistory持久化时仅对该列表中的修改属性进行操作。
参考资料:
1、Eric Evans《领域驱动设计--软件核心复杂性应对之道》
2、Robbin《总结一下最近关于domain object以及相关的讨论》http://www.iteye.com/topic/11712
- 大小: 16.3 KB
- 大小: 29.5 KB
分享到:
相关推荐
基于DDD领域驱动设计通用后台权限系统开发,响应式布局BootStrap,精美后台模板加代码,可更换皮肤。
DDD面向对象设计,数据行为绑定,告别贫血模型;降低复杂度,分而治之; 优先考虑领域模型,而不是切割数据和行为;准确传达业务规则,业务优先;代码即设计;欢迎有需求的朋友下载。
DDD实战,领域驱动设计 DDD在旅游电商架构演进中的实践 Every Entity as A Microservice - 领域驱动设计DDD 分享我对领域驱动设计(DDD)的学习成果 化繁为简--DDD驱动复杂业务软件架构的演进 基于DDD的领域建模中的...
1 DDD领域驱动设计概述 2 DDD核心概念 3 领域建模 : 事件风暴 4 DDD的中台、微服务架构映射 5 DDD架构演进
DDD领域驱动设计&中台实践资料合集,共20份。 DDD促进传统架构微服务转型 化繁为简--DDD驱动复杂业务软件架构的演进 基于FP的DDD实践 基于DDD的领域建模中的模版和工具实践 架构分层模型适配 金融支付系统的改造之...
领域驱动设计基础知识 领域服务 聚合及聚合根(Aggregate,Aggregate Root) 实体(Entity) 值对象(Value Object 工厂(Factory) 关联的设计 仓储(Repository)
基于Golang语言结合领域驱动设计(DDD) 实现o2o业务模型项目源码,支持线上商店,线下门店;多渠道(商户)、多门店、商品、规格SKU、快照、订单、促销、支付、配送等功能
一个基于 DDD 领域驱动设计 CQRS 命令查询职责分离 的 .net core 框架,完全开源。ASP.NET Core 2.1 应用, 包含 DDD、CQRS 和事件回溯。
最新领域驱动设计(DDD)资料合集,共23份。 金融支付系统的改造之路 化繁为简--DDD驱动复杂业务软件架构的演进 基于DDD的领域建模中的模版和工具实践 基于FP的DDD实践 架构分层模型适配 可视化的遗留系统微服务...
DDD领域驱动设计&中台实践资料(20份): DDD促进传统架构微服务转型(42页).pdf DDD在旅游电商架构演进中的实践(47页).pdf DDD实践中的那些坑(28页).pdf DDD的为与不为(25页).pdf Every Entity as A ...
JAVA,DDD领域设置模型,JAVA案例源码,让你1秒就懂DDD。
本文采用 DDD(领域驱动设计)作为微服务设计指导思想,通过事件风暴建立领域模型,合理划分领域逻辑和物理边界,建立领域对象及服务矩阵和服务...本文适用于按照 DDD 设计方法进行微服务设计和开发的项目及相关人员。
P11 DDD实践——不同侧重点的DDD总结 课程特点: 大白话讲解领域驱动设计的晦涩词汇,手把手学习战略设计和战术设计,并配合实际项目进行开发落地实战,包括四层架构、洋葱架构、六边形架构、整洁架构等讲解。
采用的架构是基于DDD领域驱动设计思想的BFF架构。目标是打造一个支持多端适配、分布式、高可用、多模块的系统。在未来可扩展成任意的企业中后台系统解决方案。 前端基于 Ant Design 5.0,为 Web ….zip 适合学习/练...
DDD的全称为Domain-driven Design,即领域驱动设计。下面我从领域、问题域、领域模型、设计、驱动这几个词语的含义和联系的角度去阐述DDD是如何融入到我们平时的软件开发初期阶段的。要理解什么是领域驱动设计,首先...
视频详细讲解,需要的小伙伴自行网盘下载,链接见附件,永久有效。 第1章 初步了解DDD 课程介绍 抛开杂念,看看传统三层CRUD编程方式 DDD领域驱动设计到底是什么? DDD和传统三层优劣势比较 DDD在国内现象是个什么...
基于 DDD 架构的电商微服务项目实践-kafeiMall
DDD 领域驱动设计
DDD技术实例
DDD领域驱动设计