领域驱动设计(下面发现了篇不错的文章,和大家分享)
领域驱动设计:理念,架构和若干重要细节
绪论:
三点:软件开发的方法论,讨论系统分层的必要性,提出构建领域模型的重要性;讨论OO技术是构建领域模型的主角;
争论:面向对象还是面向数据
?一个
企业级应用的系统架构是应该面向对象还是面向数据
(目前还是一面向数据为主流)
的争论由来已久,并且从未停止过.这是一个非常尖锐且很难抉择的问题.产生这一问题的根源就在于当前企业级应用所依赖的数据库几乎无一例外的都是关系型数据库,关系型数据已经盛行了很多年,它也确实....但是后来随着面向对象技术的兴起,人们意识到面向对象技术在解决复杂业务问题上有着无可比拟的优势
(什么优势)
.这又驱使人们试图通过oo技术构建一个领域模型来处理业务逻辑
.然后面向对象的领域模型和面向关系的数据模型天生存在着巨大的差异,这种差异使得企业级应用中构建领域模型变得
在基于企业级应用必须依赖于关系数据库的前提下,人们并没有放弃通过OO技术构建领域模型的尝试,随着这方面的理论不断地成熟,具有实际可操作性的设计模式被总结并加以应用,人们逐渐地总结出了一整套将对象模型映射成关系模型的理论和方法,并产生了很多优秀的ORM框架
,从而在关系模型和领域模型之间构建起一座桥梁,让开发人员得以通过OO技术来解决复杂的领域问题.
客观地讲,当今的企业级应用的主流依然是以面向数据为主
.
我们无意要在这里比较孰优孰略,但是一般而言,对于那些数据量巨大,性能要求较高的系统,面向数据的架构要更好一些
,而对于业务逻辑复杂,需求变动频繁的系统,面向领域的架构会更加适合.
当然,正所谓技高人胆大,想要做到鱼和熊掌兼得,也不是不可能的.如何权衡整体的得失做出全局性的决策,让系统的综合性能达到最高,是一名架构师安身立命的核心技能之一.
1.领域模型:重中之重
从mvc谈起,涉及CC中关于软件复杂度管理的论述.
若干处来,MVC之所以成为一种广泛应的经久不衰的架构模式,根本原因在于它对一个软件系统做了合理的划分
自...以来,人类之所以能够完成各种宏大的工程,无不在应用这样一条放之四海而皆准的原则:将复杂任务分解为多个简单的子任务!也就是"关住点分离
".MVC便是这一恩想下的典型架构
2.领域模型中的重要元素:
Entities
Value Objects
Aggregates
Domain Events
2.ORM不能回避的现实问题
在构建领域模型时,ORM确实是非常非常重要的一环.而且这一环也非常复杂,包括类继承体系与数据库的映射,抓取策略和缓存管理在内的一系列问题都是非常棘手的.即使我们现在已经有了像Hibernate这样优秀成熟的ORM框架,开发人员依然必须对ORM的原理和内部机制有深入地了解才能完成这一工作.否则领域模型很可能会受到数据库关系模型的"污染"进而被"同化",或者更常见的情况是因为糟糕的映射导致系统性能严重下降.讲到这里想说句题外话.笔者认识很多从事企业级应用开发的朋友,他们中有很多学习和使用Hibernate已经有三四年了,但是自觉依然不得要领,他们在项目中总是固定使用Hibernate中的"一小部分"功能,对一些所谓的"高级"机制从为涉及过,而且也找不适用的场合.这说明他们过去参与过的项目并没有构建过直正的领域模型
.如果我们从领域模型的角度出发去思考对象应该如何从数据库中重建出来,我们就会发现我们会面临很多"必须"面对的问题,当你带着这些问题去学习一个ORM框架时,你会惊奇地发现,你所想到过的这些问题框架都给出了解决方案.学习ORM框架,必须要有面向对象方面的设计思想作为背景
,总是从
领域模型出发思考如何映射到数据库
,如何从数据库中加载出对象才能领悟ORM框架的真实用意.
阻抗失配
关于性能的考量;可选方案.
3.IOC&AOP:重要的补充
虽然人们将IOC视为一种设计模式,但由于IOC所解决的问题几乎是所有OO系统都会遇到的,也可以说是OO技术本身在对象创建方面的缺失或者说是天生不足,这才导致IOC变得如此必须.,显然,IOC有着超越一般设计模式的重要地位,
如同rod jonason所赞叹:"再怎么赞扬IOC的好处都不为过!",IOC对于OO来说,就如同
4.团队管理和工作流程
5.应用领域驱动设计的面临的巨大挑战
面向数据还是面向领域?这是个问题!
为什么有如此之多的系统是面向数据而不是面向领域的?
DDD一书中引入的独创性概念中,Aggregation是非常重要的一个.这个概念在此之前从末被提出过,它对进一步合理细分领域模型提供了非常好的理论依据.划分Aggregation是对领域模型的进一步深化,Aggregation能阐释领域模型内部对象之间的深层关联.对Aggregation的划分会直接映射到程序结构上.比如:DDD推荐按Aggregation设计model的子包.每个Aggregation配备一个Repository.Aggregation内部的非root对象是通过导航获得的.等等.
若干重要细节:
1.如何建立完整,自封闭的领域模型。举例:user.subscribe()和user.post(Message reply)
所有的外部请求到达应用层后,应用层知道如何把外部请求转换成驱动模型运转的指令,模型根据指令运转到达结果状态,外部视图选取模型中用户关心的部分呈现出来。
2.如何建模领域服务。
3.关于领域对象的依赖注入
参考:AspectJ in Action
http://www.infoq.com/news/2008/02/ddd-di-aop
Spring参考文档:6.8.1. Using AspectJ to dependency inject domain objects with Spring
4.Repository VS. DAO
Repository:位于领域层,面向Aggregation Root。
DAO:是面向数据访问的,不再需要。在领域领域驱动的项目中,去除DAO,淡化数据访问的概念,使用更加OO的Repository来替代。
5.关于领域对象和领域服务以及Repository之间的互相依赖问题。
当领域对象所需要的数据需要通过查询得到时应该怎么办?
1.通过为领域对象注入Repository来实现。
2.通过异步消息机制+Domain Event的形式来实现
考虑核心问题:领域对象可不可以依赖Repository?
一种声音:有个感觉是无论是DAO或者是Resposity,都是domain logic里的噪声。如果Domain logic也能透明的调用DAO或Respoisty,这样的domain模型会更完美,而且更关注业务。
这么说来repository只用来取root?从概念上讲不错,可是要知道往往一个root下面会有成百上千个node,这么巨大的一坨关系树我们用repository取出来然后在“关系之间游走”...是否有点滑稽?呃...或许我们能想到引入延迟加载,取出来的root下的二级node都用stub来占位;不过这又为污染我们纯洁的领域模型创造了良机...
我们常说的“领域模型”是一个分析模型,是对领域问题的整体表述,决不是编程的实现模型,一个领域概念不一定会隐射成一个类,有可能要映射很多的类。同样,我们的实现模型也有很多领域模型不设计或不关心的东西,像领域对象的crud,等。这对我们是一个启示,在从领域模型到实现模型的隐射过程中,我们要明白它们各自的本质。这对实现模型的组织结构也有一定的借鉴意义。
“领域模型”是一个针对业务逻辑抽象的模型,是一组概念的集合,和软件编程并无关系。
Repository的角色和Factory有些类似,它是一种编程层面上的Artifact,并无业务意义。对于它在架构中的位置,可能放在Model里会好些。就像是Factory总是伴随它的产品在一起一样。
架构:
1.包结构:
领域层应该按业务逻辑相关性(即aggregation)来组织。
应用层面向外部应用,不应该使用领域层的分割模式。展现层同样如此。
关于领域层的各对象:
领域对象和领域服务是领域模型的主体,地位相当,应等同对待。
Repository和Factory一样,属于设计和实现层面的衍生产物,在领域模型中没无对应概念,但是确实应该置于领域层!
DDDSample中把一些依赖具体框架的实现类划分到infrastructure包的做法,并不是一个好的做法。这分法试图突出领域层的“纯粹性”,但是,我们要明确,领域模型并不是领域层,领域层是领域模型的编程实现,既然是“实现”,那些具体类是不可避免的。它们是“实现模型”的重要组成部分!如果隔离到nfrastructure包,反而在包结构上让它与它们的实现类产生较大的距离,这种包结构好不到哪里去。
本文来自CSDN博客,转载请标明出处:
http://blog.csdn.net/bluishglc/archive/2009/10/16/4684029.aspx
分享到:
相关推荐
Java作为一门成熟且应用广泛的编程语言,在企业级应用开发中占据着举足轻重的地位。Spring Boot作为Java生态中的一颗璀璨之星,因其简化配置、快速启动、独立运行的特点而备受青睐。Spring Boot通过约定优于配置的...
【标题】"java-ddd-demo-dice"是一个基于Java实现的领域驱动设计(Domain-Driven Design,DDD)示例项目,主要用于演示如何在实际开发中运用DDD的理念和技术。DDD是一种软件开发方法,它强调将复杂的业务逻辑通过...
Java以其跨平台、面向对象等特性,在企业级应用开发中广泛使用。它稳定、安全且有着丰富的开源生态系统,非常适合构建大型的业务系统。该项目通过Java语言的高效使用,结合DDD原则,试图为货运行业的特殊需求提供...
- **轻量级企业架构**:涵盖了Spring框架、Struts框架、Hibernate框架等轻量级框架的使用,以及它们在简化企业级应用开发中的作用。 - **WebServices开发技术**:讲解了SOAP、REST等Web服务协议,以及如何使用Java来...
Java作为广泛使用的后端编程语言,提供了丰富的库和生态系统,是构建大型企业级应用的理想选择。 在"content_code"这个压缩包文件中,可能包含了整个项目的源代码,包括但不限于以下内容: - `pom.xml`或`build....
- **Spring Boot**:这是一个流行的Java框架,用于快速构建微服务和企业级应用。它简化了配置,提供了丰富的生态支持,是实现DDD的理想选择。 - **Spring Data JPA** 或 **Hibernate**:用于ORM(对象关系映射),...
DDDplus最初是cp-ddd-framework(cp表示中央平台:中台),是用于复杂业务体系结构的轻量级灵活开发框架。 源于企业,服务企业! 一套轻量级业务中台开发框架,以思想为本,致力于业务资产的可沉淀可传承,全面...
而Java作为一种流行的编程语言,其在企业级应用开发中占据着举足轻重的地位。将DDD设计模式与Java语言结合起来,可以更好地实现复杂系统的建模和开发。 项目中的Java源文件是脚手架的核心,它们直接关系到DDD架构的...
3. 学习使用Spring框架进行企业级Java应用开发,包括Spring Boot、Spring MVC等技术。 4. 了解项目构建工具Maven的使用,包括依赖管理、构建生命周期等。 5. 掌握如何利用XML和SQL等技术实现配置和数据库交互。 6. ...
Java作为一门成熟的编程语言,拥有庞大的开发者群体和丰富的库资源,这使得其成为开发复杂系统,尤其是在企业级应用中非常受欢迎的选择。XML配置文件和UML图文件是软件开发中不可或缺的部分,它们分别用于配置服务的...
Spring 是一个流行的开源 Java/Java EE 全功能栈框架,它提供了创建企业级应用的各种工具和库。在 DDD 的实现中,Spring 可以用于构建应用层和基础设施层,提供依赖注入、面向切面编程(AOP)、事务管理等功能。...
Java作为一门广泛使用的编程语言,其在企业级开发中的地位无可撼动。DDD结合Java,无疑为处理大型系统和复杂业务逻辑提供了一种有效的解决方案。通过本项目的源码学习,开发者可以更深入地了解Java在DDD实践中的应用...
Java是一种广泛使用的面向对象编程语言,尤其适合大型企业级应用,其强大的类型检查、跨平台能力和丰富的库支持使得它成为实现DDD和六边形架构的理想选择。 **详细知识点:** 1. **域驱动设计(DDD)**:DDD是一种...
在当今信息化飞速发展的时代,软件开发领域不断涌现出新的设计理念与技术,其中领域驱动设计(DDD)架构在企业级应用开发中占据了重要的地位。DDD强调从领域模型出发,以领域为核心来指导软件设计和开发过程。它要求...
描述中的"ddd-javaee7 在 Java EE 7 和开源世界中应用 DDD"进一步确认了这个项目或教程是关于如何在Java EE 7环境下利用DDD原则来开发软件,尤其是考虑到了开源工具和框架的使用。 **标签:** 标签"Java"表明这个...
不仅如此,该系统还集成了分布式锁、分布式事务等高端企业级功能,以确保系统的高性能和稳定性。 首先,SpringCloud-Alibaba微服务架构是目前流行的一种分布式系统架构,它基于Spring Boot框架,支持快速构建分布式...
在当今快速发展的信息技术领域,Java语言因其强大的跨平台特性、丰富的库支持和稳定的性能,成为企业级应用开发的首选语言之一。随着Web技术的不断进步,HTML、CSS和JavaScript成为构建前端用户界面的核心技术。在...
其中,40个Java源文件和10个XML配置文件占据了项目文件的主体,展示了Java在构建企业级应用中的核心作用;而Dockerfile和Python脚本文件则体现了项目对于环境无关性和自动化部署的重视。通过这种混合编程方式,项目...
在现代企业级应用开发中,DDD已经成为构建复杂系统的重要工具,特别是在微服务架构中,其价值更为凸显。 微服务架构将大型应用程序拆分为一组小而自治的服务,每个服务都专注于特定的业务功能。这种架构风格提高了...
使用场景及目标:帮助读者深入了解企业级应用开发中常见的技术难题及其解决思路,为即将到来的技术面试做好充分准备。同时,也为日常工作中遇到类似问题提供参考。 阅读建议:建议读者结合自身项目经验和实际工作...