`
Taven
  • 浏览: 43475 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

领域驱动设计和开发实战-住房贷款处理系统

阅读更多

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->本文先阐述领域驱动设计的基本概念,然后以住房贷款系统的需求为引线,一步一步实战讲解如何进行领域驱动设计的开发,文章来源与网上,先贴出与大家一起分享。
李锡远
2010-8-20

 

背景

驱动设计(DDD)的中心内容是如何将业务领域概念映射到件工件中。大部分于此主的著作和文章都以Eric Evans的驱动设计,主要从概念和设计的角度探讨领域建模和设计情况。些著作讨论实体、值对象、服等DDD的主要内容,或者谈论通用、界定的上下文(Bounded Context)和防护层(Anti-Corruption Layer)些的概念。

本文旨在从践的角度探讨领域建模和设计及如何着手域模型并实际实现它。我将着眼于技主管和架构实现过程中能用到的指、最佳践、框架及工具。驱动设计开发也受一些架构、设计实现方面的影响,比如:

 

  • 1、业务规则
  • 2、持久化
  • 3、缓
  • 4、事管理
  • 5、安全
  • 6、代生成
  • 7、测试驱动开发
  • 8、重构

 

本文讨论这些不同的因素在施的整个生命周期中怎样对生影响,有架构实现成功的DDD中应该求什。我会先列出域模型应该的典型特征,以及何在企中使用域模型(相于根本不使用域模型,或使用血的域模型来)。

文章包括一个理示例用,来演示如何将设计、以及讨论开发最佳践,用在真驱动开发项目之中。示例用用了一些框架去 现贷域模型,比如Spring、Dozer、Spring Security、JAXB、Arid POJOs和Spring Dynamic Modules。示例代用Java写,但大多数开发,不论语言背景如何,代都是很容易理解的。

 

引言

 

域模型来了一些好,其中有:

  • 1、有助于团队创建一个业务IT都能理解的通用模型,并用模型来沟通业务需求、数据体、程模型。
  • 2、模型是模化、可展、易于维护的,同时设计还反映了业务模型。
  • 3、提高了业务领象的可重用性和可性。

来,如果IT团队开发大中型企业软不遵循域模型方法,我看看会生些什

 

不投放源去建立和开发领域模型,会用架构出肥服务层和“血的域模型”,在这样的架构中,外观类(通常是无状Bean聚越 来越多的业务逻辑,而只有getter和setter方法的数据体。这种做法域特定业务逻辑规则散布于多个的外观类中(有些 情况下会出逻辑)。

 

在大多数情况下,血的域模型没有成本效益;它不会公司来超越其它公司的优势,因这种架构里要实现业务需求更,开发并部署到生产环境中去要花时间

 

在考DDD实现目中各架构和设计因素之前,先看看富域模型的特性:

  • 1、领域模型应该侧重于具体的业务操作域。它应该结业务模型、策略和业务流程。
  • 2、它应该业务中的其它域,用架构中的其它隔离来。
  • 3、它应该可重用,以避免相同的核心业务领域元素有任何重的模型和实现
  • 4、模型应该设计得与用中的其它松耦合,意味着与上下两(即数据和外观类)都没有依赖关系。
  • 5、它当是一个抽象的、清晰划分的次,以使维护测试、版本理更容易。可在容器外(从IDE中)对领类进测试
  • 6、它应该POJO程模型来设计,没有任何技或框架依性(我是告公司里我工作的团队,我们软开发用的技Java)。
  • 7、领域模型应该独立于持久化实现细节(尽管技模型有一些限制)。
  • 8、它应该最小程度地依于任何基础设施框架,因它将比些框架更久,我也不希望与任何外部框架耦合。

 

实现软开发中更高的投率(ROI),业务单位和IT的高管理人业务领域建模及其实现的投上(时间、金源)全力以赴。来看看实现领域模型需要的其它因素。

 

  • 1、团队应该经常接近业务领域主题专家。
  • 2、IT团队(建模者、架构开发良好的建模、设计技能。
  • 3、分析师应该具有良好的业务流程建模技能。
  • 4、架构开发员应该有丰富的面向设计OOD)和程(OOP经验

驱动设计在企架构中的作用

域建模和DDD在企架构(EA)中发挥着重要的作用。因EA的目之一就是合IT和业务业务实体的代表——域模型就是EA的核心部分。就是大多数EA件(业务或基础设施)应该围绕领域模型设计实现的原因。

 

驱动设计SOA

 

面向服的体系架构(SOA)最近帮助团队构建基于业务流程的件构件和服、加速新品上市时间势头越来越强劲驱动设计是SOA的一个关键因素,因它有助于封装象中的业务逻辑规则域模型也提供了定使用的言和上下文。

 

如果没有域模型,SOA的行就应该包括域模型的设计实现。如果我过强调SOA、忽略了域模型的重要性,那我用架构中最得到的就是一个血的域模型和臃的服

 

理想的情况是,在开发应和SOA件的同,迭代地实现DDD,因为应和SOA件都是域模型要素的直接消者。使用丰富的实现,通 过给领象提供一个壳(代理),SOA设计得相对简单。但如果我注SOA,在后端却没有一个像域模型,业务就会用不完整的域模 型,可能会致出一个脆弱的SOA架构。

 

目管理

 

域建模目通常包括以下步骤

  • 首先为业务流程建模并文档化。
  • 选择一个候业务流程,与业务领家一起使用通用言来文档化业务流程。
  • 识别选业务流程需要的所有服些服上可以是原子的(单步的)或合好的(多的,有无工作流皆可)。它也可以是业务(比如承保或金)或基础设施(比如件或工作度)。
  • 上一步识别的服所使用的象,确定并文档化其状和行

业务领域核心元素的候,就将模型保持在高水平是非常重要的。

 

目管理的点来看,真的DDD实现项目和其它开发项目所包含的段是一的。段包括:

  • 对领行建模
  • 设计
  • 开发
  • 测试和集成测试
  • 基于设计开发来完善、重构域模型(模型概念的持集成(CI))。
  • 使用更新的域模型重上述步骤实现CI)。

非常适合在里使用敏捷开发方法学,因敏捷方法注重于交付商,恰好DDD重于件系业务模型。此外,就DDD迭代的特性来 ,SCRUM或DSDM这样的敏捷方法对项目管理来也是更好的框架。合使用SCRUM(适用于目管理)和XP(适用于开发)方法对处理 DDD实现项目来非常好。

 

DDD迭代周期的目管理模型如1所示。

1. DDD迭代周期

 

域建模可以驱动设计于如何实现领象模型,Ramnivas Laddad推荐如下的步骤。他强调要更重于域模型中的象,而不是服

 

  • 体和逻辑开始。
  • 不要一始就从服务层开始,只添加那些逻辑不属于任何体或值对象的服
  • 利用通用言、设计(DbC)、自测试CI和重构,使实现尽可能地与域模型合。

设计实现的角度来看,典型的DDD框架应该支持以下特征。

 

  • 应该是一个以POJO(如果你的公司以.Net,就是POCO的架构。
  • 应该支持使用DDD概念的业务领域模型的设计实现
  • 应该支持像依注入(DI)和面向方向程(AOP些概念的箱即用。(注:稍后将在文章中详细释这些概念)。
  • 测试框架整合,比如JUnitTestNGUnitils等。
  • 与其它Java/Java EE框架行良好的集成,比如JPAHibernateTopLink等。

示例

 

本文中使用的示例用是一个住房理系业务用例是批准住房款(抵押)的金申。将款申提交抵押放公司的 候,首先要通承保程,承保人在程中根据客的收入情、信用记录和其它因素来决定批准是拒绝贷求。如果款申请获得承保的批准, 就批程序的清和融资步骤

 

理系中的融动给贷款人支付金。通常,融资过程从抵押放公司(通常是行)将款包给产权公司始。接着产权公司款包,并与房产买卖双方一起确定款的时间款人和方与算中介在产权公司会面、协议,来移房产产权

 

架构

 

典型的企业应用架构由下面四个概念上的层组成:

 

  • 界面(表现层):负责给展示信息,并解命令。
  • 该层协调应用程序的活。不包括任何业务逻辑,不保存业务对象的状,但能保存用程序任务过程的状
  • 包括业务领域的信息。业务对象的状里保存。业务对象的持久化和它的状可能会委托础设
  • 础设其它是一个支持性的。它提供的信息传递实现业务对象的持久化,包含界面的支持性等。

详细地看一下层。

 

  • 负责应用中UI屏幕之航,以及与其它系统应的交互。
  • 户输入的数据行基本(非业务)的验证,然后再把数用的其它(更底)。
  • 不包含任何业务域相逻辑、或数据访问逻辑
  • 没有任何反映商用例的状,但却能理用或任务进展的状

  • 负责业务领域的概念,业务用例和业务规则的相信息。象封装了业务实体的状和行用中的业务实体例子有抵押(Mortgage)、房Property)和款人(Borrower)。
  • 如果用例跨越多个用户请求(比如款登记过程包含多个步骤:用户输详细信息,系基于款特性返回品和利率,用户选择特定的/利率合,最后系会用利率款),可以管理业务用例的状(会)。
  • 包含服务对象,些服务对象只包含一个定好的、不属于任何象的可操作行。服封装了业务领域的状,而业务领域并不适用于象本身。
  • 是商业应用的核心,应该用的其它隔离来。而且,它不应该于其它使用的用框架(JSP/JSFStrutsEJBHibernateXMLBeans等)。

下面的2示了用中使用的不同架构次,以及它与DDD有怎系。

 

2. 层应用架构

 

下面的设计观点被认为是目前DDD实现诀窍的主要部分:

  • 面向程(OOP
  • 注入(DI
  • 面向方面程(AOP

OOP实现中最重要的基本原应该利用像承、封装和多态这样的OOP概念,使用Plain Java和接口来设计领象。大部分域元素是既有状(属性)又有行(操作状的方法或操作)的真正象。它时对应于真世界的概念,能很合 适地适用于OOP概念。DDD中的体和值对象都是OOP概念的典型例子,因有状和行

 

在典型的工作元(UOW)中,象需要与其它的作,无论这象是服是工厂。需要理其它那些本身就横切的 注点, 比如域状态变化跟踪、审计存、事管理(包括事)。些都是可重用、非域相注点,通常很容易在包括的整个代中散布和重。在 象中嵌入该逻辑和非域相的代互相纠缠生混乱。

 

之没有耦合的代赖关系和隔离横切注点的候,OOP并不能独自为领驱动设计开发提供极好的设计解决方案。在是可以利用DI和AOP这样设计概念OOP充,以尽量减少耦合、提高模化、更好地理横切注点。

 

注入

 

DI能很有效地将配置和依象中移出。此外,类对数据访问对象(DAO)、服务类对领设计性使得DI成DDD实现中“必有”的内容。通和服的其它象注入到象,DI有助于建一个更清晰、松耦合的设计

 

在示例用中,服务对象(FundingServiceImpl)利用DI注入象(LoanBorrowerFundingRequest)。体也通DI引用的,像数据源、Hibernate工厂管理器些其它的Java EE源也被注入到服库对象中。

 

面向方面

 

象中移除横切注点代,比如检查域状态变化跟踪等,AOP有助于实现一个更好的设计(即在域模型中少一些乱七八糟的内容)。可利用 AOP把象和服注入象,特是那些容器没有例化的象(比如持久化象)。在可以利用AOP的中,其它的方面有存、事管理和基 于角色的安全(授)。

 

用利用自定方面将数据存引入服务对象。品和利率信息从数据表中加一次(客端第一次些信息),然后存到适用于后面品和利率找的存(JBossCache)中。品和利率会被访问,但不会定期更新,所以<sp

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics