`
老顽童
  • 浏览: 48143 次
  • 性别: Icon_minigender_1
  • 来自: 默认
社区版块
存档分类
最新评论

java企业级开发--DDD

阅读更多

领域驱动设计(下面发现了篇不错的文章,和大家分享)

 

领域驱动设计:理念,架构和若干重要细节

 

绪论:

三点:软件开发的方法论,讨论系统分层的必要性,提出构建领域模型的重要性;讨论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

分享到:
评论
2 楼 satuo20 2014-02-18  
没有例子,你说个JB.
1 楼 老顽童 2010-07-04  
在解决复杂业务问题上有着无可比拟的优势(什么优势),谁知道来说说?

相关推荐

    java-ddd-demo-dice

    【标题】"java-ddd-demo-dice"是一个基于Java实现的领域驱动设计(Domain-Driven Design,DDD)示例项目,主要用于演示如何在实际开发中运用DDD的理念和技术。DDD是一种软件开发方法,它强调将复杂的业务逻辑通过...

    北大Java高级技术课程pdf(1)

    - **轻量级企业架构**:涵盖了Spring框架、Struts框架、Hibernate框架等轻量级框架的使用,以及它们在简化企业级应用开发中的作用。 - **WebServices开发技术**:讲解了SOAP、REST等Web服务协议,以及如何使用Java来...

    DDD在Java框架的例子课程.zip

    - **Spring Boot**:这是一个流行的Java框架,用于快速构建微服务和企业级应用。它简化了配置,提供了丰富的生态支持,是实现DDD的理想选择。 - **Spring Data JPA** 或 **Hibernate**:用于ORM(对象关系映射),...

    smart-lottery抽奖系统基于COLA架构采用DDD领域驱动中四层架构

    Java作为广泛使用的后端编程语言,提供了丰富的库和生态系统,是构建大型企业级应用的理想选择。 在"content_code"这个压缩包文件中,可能包含了整个项目的源代码,包括但不限于以下内容: - `pom.xml`或`build....

    cp-ddd-framework:一个轻量级的灵活开发框架,用于具有完整生态系统的复杂业务体系结构!轻量级业务中台开发框架,中台架构的设计和完整解决方案!

    DDDplus最初是cp-ddd-framework(cp表示中央平台:中台),是用于复杂业务体系结构的轻量级灵活开发框架。 源于企业,服务企业! 一套轻量级业务中台开发框架,以思想为本,致力于业务资产的可沉淀可传承,全面...

    ms-ddd-archetype:基于域驱动设计(DDD)和六边形体系结构的原型

    Java是一种广泛使用的面向对象编程语言,尤其适合大型企业级应用,其强大的类型检查、跨平台能力和丰富的库支持使得它成为实现DDD和六边形架构的理想选择。 **详细知识点:** 1. **域驱动设计(DDD)**:DDD是一种...

    ddd-javaee7:在 Java EE 7 和开源世界中应用 DDD

    描述中的"ddd-javaee7 在 Java EE 7 和开源世界中应用 DDD"进一步确认了这个项目或教程是关于如何在Java EE 7环境下利用DDD原则来开发软件,尤其是考虑到了开源工具和框架的使用。 **标签:** 标签"Java"表明这个...

    基于DDD(领域驱动设计)并支持SaaS平台的微服务框架

    在现代企业级应用开发中,DDD已经成为构建复杂系统的重要工具,特别是在微服务架构中,其价值更为凸显。 微服务架构将大型应用程序拆分为一组小而自治的服务,每个服务都专注于特定的业务功能。这种架构风格提高了...

    Java基于DDD架构的请假审批系统源码.zip

    Java基于领域驱动设计(DDD)的请假审批系统是一种采用先进的软件开发方法来构建的企业级应用。DDD强调将复杂的业务逻辑转化为可理解的模型,通过领域专家与开发人员的紧密合作,将业务领域的知识转化为代码。在这个...

    ddd-cqrs-base-project:自动从code.google.compddd-cqrs-base-project导出

    《ddd-cqrs-base-project:基于Java的领域驱动设计与命令查询职责分离实践》 ddd-cqrs-base-project是一个基于Java的开源项目,其主要目标是实现领域驱动设计(Domain-Driven Design,简称DDD)与命令查询职责分离...

    microservice-ddd

    微服务架构与领域驱动设计(DDD)是现代企业级应用开发中的重要技术组合。本文将深入探讨微服务架构的核心概念,以及如何结合领域驱动设计在Java环境下构建高效、可维护的系统。 微服务架构是一种软件开发方法,它...

    java架构师之路:JAVA程序员必看的15本书的电子版下载地址知识.pdf

    虽然没有中文版,但它是理解企业级Java应用程序设计的基石。 - **《Expert One-on-One J2EE Development without EJB》**:这本书由JavaEye的专家团队翻译,讨论了如何在不使用EJB的情况下进行J2EE开发,对于理解轻...

    Java Magazine MayJune 2018

    持久层是应用程序中负责数据存储的部分,对于大多数企业级应用而言至关重要。 - **设计模式**:详细讲解了几种与 JPA 和 Hibernate 相关的设计模式,包括实体管理器的使用、事务处理策略等。 - **实例演示**:通过...

    javaEE源码报告-cargotracker-ddd:使用JavaEE的领域驱动设计

    JavaEE作为企业级应用开发的主流平台,其强大的功能和灵活性深受开发者喜爱。本报告将深入探讨一个名为"Cargotracker"的项目,该项目采用领域驱动设计(Domain-Driven Design,简称DDD)这一先进的软件开发方法论,...

    一些java学习方法

    本文将基于“一些java学习方法”这一主题,深入解析如何通过理解Web、设计模式、框架应用、企业级开发模式等多个层面来构建扎实的Java技能体系。 ### 一、学习Web基础 Web技术是Java开发的重要组成部分,尤其是...

    基于DDD(领域驱动设计)并支持SaaS平台的单体应用开发框架

    基于DDD(领域驱动设计)并支持SaaS平台...网上基本讲的都是DDD的理论很少有讲怎么落地,xtoon-boot提供了完整落地方案和企业级手脚架;可以快速开发,框架提供了系统管理和组织架构等核心模块;支持多租户的SaaS平台;

    基于Spring Authorization Server全新适配OAuth 2.1协议的企业级微服务架构和服务能力开发平台

    Dante Cloud 是一款企业级微服务架构和服务能力开发平台,是采用领域驱动模型(DDD)设计思想的、全面拥抱 Spring Authorization Server 的、基于 OAuth2.1 协议的、支持智能电视、IoT等物联网设备认证的多租户微服务...

    Effective Enterprise Java中文版

    企业级Java平台(J2EE/Java EE/ Jakarta EE)提供了丰富的API和技术栈,用于解决企业级系统开发中的常见问题。这包括但不限于: - **Web服务**:用于实现跨平台、跨语言的系统间通信,支持SOAP、REST等协议。 - **...

    2019全网最细的Java学习路线图

    本Java学习路线图旨在帮助Java学习者快速掌握Java基础知识点、数据库知识点、Web前端技术、JavaWeb基础、Java高级框架设计模式、分布式系统架构和工程化管理等知识点,助力Java学习者快速提高Java开发能力。

    基于SpringAuthorizationServer全新适配OAuth2.1协议的企业级技术中台微服务架构与服务能力开发平台

    Dante Cloud (但丁,原 Eurynome Cloud) 是一款企业级微服务架构和服务能力开发平台,是采用领域驱动模型(DDD)设计思想的、全面拥抱 Spring Authorization Server 的、基于 OAuth2.1 协议的、支持智能电视、IoT等...

Global site tag (gtag.js) - Google Analytics