领域驱动设计实践
- 格式:doc
- 大小:320.00 KB
- 文档页数:19
经典的领域驱动设计在代码实践方面的心得体会经典的领域驱动设计在代码实践方面的心得体会创建领域对象采用构造函数或者工厂,如果用工厂时需要依赖于领域服务或仓储,则通过构造函数注入到工厂;领域服务可以依赖仓储或聚合根;一个聚合根配备一个仓储;仓储应理解为一个在内存中维护一系列聚合根的集合;一个聚合有一个聚合根,聚合根也是一个Entity,聚合内还有其他Entity和Value Object;仓储提供的方法应该总是接受聚合根或返回聚合根,不能返回聚合内的其他Entity或Value Object;聚合内的非跟的Entity以及Value Object之间不要相互引用,聚合内的所有Child可以对根Entity持有引用,如果一个Child Entity需要和另外一个Child Entity交互,则因该通过聚合根完成;聚合根与聚合根之间应避免直接对象引用,而应该采用ID关联;聚合根与聚合根之间的关系不像聚合内的Entity之间这么强烈内聚,它们之间仅仅是某种比较弱的关联关系,每个聚合根都有其独立的生命周期;聚合根之间通过ID关联的好处是:不会因为Load一个聚合根而把其他关联的聚合根一起Load出来,这样也避免了Load一个聚合根会把整个数据库Load出来的风险;我们应该尽量减少关联,尽量做到单向关联,只保留确实需要处理的经常需要用到的遍历方向的关联;如果一个操作仅由一个聚合根就可以完成,那么直接调用该聚合根完成即可;如果一个操作我们会遇见到会由多个聚合根相互协作完成,那么需要为该操作建立领域服务,在领域服务中以过程化的方式来一步步调用相关的聚合根完成整个业务操作;切忌不要因为领域服务的引入让聚合根变得贫血,聚合根应该有职责还是必须要由聚合根来承担;聚合根内不要依赖领域服务或仓储,如果你发现一个聚合根的职责需要依赖于某个领域服务或仓储来帮忙完成一些其他的逻辑(像判断业务规则之类),那么通常你要考虑这个职责不应该由该聚合根来承担,而应该建立合适的领域服务来承担;聚合根的主要职责是管理其内聚的所有Child Entity或Value Object的业务完整性;领域驱动设计时,为对象分配职责时,可以参考信息专家模式:将职责分配给拥有执行该职责所需信息的人;如果一个聚合根看起来拥有执行某个职责所需的信息,但没包含全部所需信息,此时则不应该将该职责分配给该聚合根,因为强行分配给它,会导致该聚合根没有内聚性,因为势必会依赖于其它的领域对象或领域服务或仓储;聚合内的所有实体和值对象应该总是一起被取出来一起被保存,因为一个聚合是一个数据持久化的单元,不需要考虑将整个聚合根取出来有性能问题,因为任何一个聚合根都有明确的边界。
领域驱动设计案例想象一下我们要开一家超酷的披萨店,这时候领域驱动设计就能派上大用场啦。
一、领域分析。
1. 核心领域:制作美味披萨。
首先得有个概念,啥是披萨呢?披萨就是面饼加上各种馅料,再烤一烤就成了。
那面饼有薄的、厚的,馅料有香肠、蘑菇、青椒、芝士等等一大堆。
这就是我们这个披萨店的核心业务,要是做不出好吃的披萨,咱这店就别开了。
2. 子领域:顾客下单。
顾客来到店里或者在网上下单,他们得能选择自己想要的披萨类型。
比如说,一个顾客想要一个薄底的,上面铺满香肠和双倍芝士的披萨。
这时候就涉及到订单的创建,要记录下顾客的要求,像饼底类型、馅料种类和数量这些重要信息。
3. 子领域:库存管理。
我们不能光接单,还得看看店里有没有足够的原料啊。
要是顾客点了一堆香肠披萨,结果店里就剩一点香肠了,那可不行。
所以得随时知道面饼、各种馅料还有芝士的库存数量。
每次做一个披萨,就得相应地减少库存。
要是库存快没了,就得赶紧补货。
二、领域模型构建。
1. 披萨类(Pizza)这个类就像是披萨的蓝图。
它有属性,比如饼底类型(thin_crust或者thick_crust),还有一个馅料列表(toppings)。
就像这样:饼底类型:薄底。
馅料:[香肠,双倍芝士]这个类还有方法呢,比如说计算成本的方法。
因为不同的饼底和馅料成本不一样,薄底可能比厚底便宜点,香肠和芝士也都有自己的成本价。
通过这个方法就能算出这个披萨的成本是多少,这样我们就能知道卖这个披萨能赚多少钱啦。
2. 订单类(Order)当顾客下单的时候就创建一个订单对象。
这个订单对象包含顾客的信息,像姓名、联系方式,还有最重要的,顾客点的披萨列表。
比如说,一个叫小明的顾客下了单,他要了两个不同的披萨。
那订单对象里就会记录下小明的名字、电话,还有那两个披萨的信息(按照披萨类的格式)。
订单类还有个状态属性,比如是“已下单”“制作中”“已完成”“已取消”。
刚下单的时候就是“已下单”状态,厨房开始做了就变成“制作中”,做好了就是“已完成”,要是顾客突然改变主意了,就变成“已取消”状态。
领域驱动设计实践合订版(战略+战术)课程内容「战略」访谈录 | 聊聊领域驱动设计(⽂字版)相信很多朋友对领域驱动设计会有这样或那样的困惑,⽐如领域驱动设计是什么?它在⼯作中有什么作⽤?为什么国内关于这⽅⾯的书籍少之⼜少?…… 为了解决这些疑惑,有幸邀请到专家张逸⽼师来聊聊领域驱动设计,下⾯是 GitChat 独家采访记录。
GitChat:领域驱动设计(Domain Driven Design,DDD)⾃诞⽣以来已有⼗⼏年时间,这门本已步⼊⽼年的⽅法学却因为微服务的兴起⽽焕发了第⼆春。
您说过这可能要归功于 DDD 的“坚硬⽣长”,但不可否认微服务确实也是⼀个重要因素,能否请您解释⼀下领域驱动设计和微服务这种深层次的匹配关系?张逸:领域驱动设计是由 Eric Evans 在⼀本《领域驱动设计》书中提出的,它是针对复杂系统设计的⼀套软件⼯程⽅法;⽽微服务是⼀种架构风格,⼀个⼤型复杂软件应⽤是由⼀个或多个微服务组成的,系统中的各个微服务可被独⽴部署,各个微服务之间是松耦合的,每个微服务仅关注于完成⼀件任务并很好地完成该任务。
两者之间更深⼊的关系,在我写的课程中已有详细讲解。
主要体现在领域驱动设计中限界上下⽂与微服务之间的映射关系。
假如限界上下⽂之间需要跨进程通信,并形成⼀种零共享架构,则每个限界上下⽂就成为了⼀个微服务。
在微服务架构⼤⾏其道的当今,我们⾯临的⼀个棘⼿问题是:如何识别和设计微服务?领域驱动的战略设计恰好可以在⼀定程度上解决此问题。
GitChat:如果说轻量化处理、⾃动部署,以及容器技术的发展使得微服务的兴起成为必然,那么是否可以说领域驱动设计今⽇的再续辉煌也是⼀种必然(或者说 DDD 在其诞⽣之时过于超前)?您能否预测⼀下 DDD 未来可能会和什么样的新理念相结合?张逸:好像领域驱动设计就从未真正“辉煌”过,所以谈不上再续辉煌,但确实是因为微服务引起了社区对它的重燃热情。
推⾏领域驱动设计确乎有许多阻⼒,⼀⽅⾯要做到纯粹的领域驱动设计,许多团队成员的技能达不到;另⼀⽅⾯,似乎领域驱动设计带来的价值不经过时间的推移⽆法彰显其价值,这就缺乏⾜够的说服⼒让⼀家公司不遗余⼒地去推⼴领域驱动设计。
基于领域驱动设计(ddd)的架构演进和实践《基于领域驱动设计(D)的架构演进与实践》1. 前言领域驱动设计(D)是一种软件开发方法,它将复杂领域模型融入到软件开发过程中,以更好地满足业务需求。
随着软件开发的不断发展,基于领域驱动设计的架构在实践中不断演进和改进。
本文将探讨基于领域驱动设计的架构演进和实践,帮助读者更好地理解这一主题。
2. D的基本概念在开始讨论基于领域驱动设计的架构演进和实践之前,让我们先了解一下领域驱动设计的基本概念。
领域驱动设计围绕着领域模型展开,它将业务需求和领域知识作为中心,通过建模和设计来解决复杂的业务问题。
在软件架构中,D强调领域模型的重要性,将业务逻辑和数据模型相结合,从而实现更加灵活、可维护和可扩展的软件系统。
3. 基于D的架构演进随着软件开发的不断发展,基于领域驱动设计的架构也在不断演进。
随着业务需求的变化和技术的进步,软件架构需要不断优化和改进;另D本身也在不断发展,为软件架构提供了更加丰富和成熟的设计理念和方法。
在基于D的架构演进过程中,我们可以关注以下几个方面:3.1 领域模型的优化在软件架构中,领域模型是非常重要的一部分。
基于D的架构演进过程中,我们可以通过不断优化领域模型来适应业务需求的变化。
可以引入领域事件、聚合根等概念来优化领域模型,从而实现更加清晰、灵活和可扩展的架构设计。
3.2 微服务架构的引入随着云计算和大数据技术的不断发展,微服务架构已经成为一种非常流行的架构模式。
在基于D的架构演进过程中,我们可以考虑引入微服务架构来实现更加灵活、可扩展和可维护的架构设计。
通过将领域模型拆分成多个微服务,我们可以更好地将业务逻辑和数据耦合度降到最低,实现更加灵活的架构设计。
3.3 事件驱动架构的应用事件驱动架构是另一种流行的架构模式,它强调将业务逻辑和数据存储之间的耦合度降到最低。
在基于D的架构演进过程中,我们可以考虑引入事件驱动架构来实现更加灵活、可扩展和可维护的架构设计。
EntityFramework之领域驱动设计实践目录EntityFramework之领域驱动设计实践 (1)EntityFramework之领域驱动设计实践- 前言 (2)EntityFramework (2)领域驱动设计(DDD) (2)EntityFramework之领域驱动设计实践(一) (2)从DataTable到EntityObject (2)EntityFramework之领域驱动设计实践(二) (5)分层架构 (5)传统的三层架构 (5)领域驱动设计的分层 (5)EntityFramework之领域驱动设计实践(三) (6)案例:一个简易的销售系统 (6)实体 (7)值对象 (9)EntityFramework之领域驱动设计实践(四) (10)存储过程- 领域驱动的反模式 (10)EntityFramework之领域驱动设计实践(五) (11)聚合 (11)EntityFramework之领域驱动设计实践(六) (14)模型对象的生命周期- 工厂 (14)EntityFramework之领域驱动设计实践(七) (16)模型对象的生命周期- 仓储 (16)EntityFramework之领域驱动设计实践(八) (17)仓储的实现:基本篇 (17)总结 (22)EntityFramework之领域驱动设计实践(九) (23)仓储的实现:深入篇 (23)EntityFramework之领域驱动设计实践(十) (31)规约(Specification)模式 (31)EntityFramework之领域驱动设计实践【扩展阅读】:服务(Services) (38)服务(Services) (38)EntityFramework之领域驱动设计实践【扩展阅读】:CQRS体系结构模式 (39)CQRS体系结构模式 (39)背景 (40)结构 (40)对象状态 (40)事件溯源(Event Sourcing) (41)快照(Snapshots) (44)事件存储(Event Store) (44)回到结构 (44)总结 (45)EntityFramework之领域驱动设计实践:总结 (46)EntityFramework之领域驱动设计实践- 前言根据网友的讨论结果,以及自己在实践中的不断积累,在整理的过程中,我会将原文中的描述作相应调整。
DDD领域驱动设计落地实践六步拆解DDD DDD(Domain Driven Design)作为一种软件开发方法论,旨在帮助开发团队更好地理解业务领域,将业务需求和技术实现有效地结合起来。
在实际项目中,落地实践DDD需要经过一系列步骤,下面将对DDD的六个关键步骤进行详细拆解。
第一步:理解领域在开始实施DDD之前,团队成员需要花费时间深入理解业务领域以及业务需求。
这包括与业务专家进行面对面沟通,了解业务中的各种概念、规则和流程。
领域专家和开发团队需要共同努力,确保他们对业务领域的理解达到一致,并将这些理解转化为领域模型。
第二步:建立领域模型领域模型是对业务领域的抽象描述,描述了业务中的各种实体、值对象、聚合和领域服务。
开发团队需要根据对领域的理解,确定合适的领域模型,并使用领域模型作为开发的基础。
建立领域模型的过程中,团队可以使用各种工具,如UML图、领域事件风暴等。
第三步:划分子域在建立领域模型的过程中,团队可能会发现业务领域非常复杂,需要划分为多个子域来管理。
划分子域的目的是确保每个子域都有清晰的边界和职责,使得团队能够更好地管理和开发业务功能。
划分子域需要围绕业务的边界来进行,将相关的实体、值对象和聚合组织在一起。
第四步:实现领域模型一旦确定了领域模型和子域的划分,团队可以开始实现领域模型。
领域模型的实现可以采用各种技术,如面向对象编程、函数式编程、事件驱动架构等。
在实现过程中,团队需要持续与业务专家进行沟通,确保领域模型能够准确地映射到业务需求。
第五步:持续演化领域模型领域模型是一个动态的概念,随着业务需求的变化,领域模型也需要不断演化。
团队应该保持领域模型的敏捷性和可变性,随时根据业务需求进行调整和修改。
持续演化领域模型需要团队成员之间的密切合作和沟通,确保领域模型始终保持与业务需求的一致性。
第六步:评估和优化最后一步是评估和优化DDD实践的效果。
团队可以通过各种方式来评估DDD对项目的影响,如代码质量、开发效率、业务需求的满足度等。
软件工程中的领域驱动设计实践在当今数字化时代,软件系统的复杂度不断增加,业务需求的变化日益频繁。
为了应对这些挑战,领域驱动设计(DomainDriven Design,简称 DDD)应运而生。
领域驱动设计是一种针对复杂业务领域进行软件设计和开发的方法,它强调将业务领域的知识与软件实现紧密结合,以构建高质量、可维护和适应变化的软件系统。
一、领域驱动设计的核心概念1、领域领域是指软件系统所涉及的业务范围和问题空间。
它包括业务中的实体、值对象、领域服务、聚合根等核心概念。
2、限界上下文限界上下文是领域驱动设计中的一个重要概念,它定义了特定领域模型的边界和适用范围。
每个限界上下文都有自己独立的领域模型、术语和业务规则。
3、聚合聚合是一组相关对象的组合,它们作为一个整体被管理和操作。
聚合根是聚合的核心,它负责维护聚合的一致性和完整性。
4、领域事件领域事件是领域中发生的重要事情,它可以用于解耦业务逻辑、实现异步处理和提高系统的可扩展性。
二、领域驱动设计的实践步骤1、领域分析在这个阶段,开发团队需要与领域专家进行深入的沟通和交流,了解业务流程、规则和痛点。
通过研讨会、访谈等方式,收集和整理领域知识,识别出核心的业务概念和实体。
例如,在一个电商系统中,可能会识别出商品、订单、用户等核心实体。
2、建立统一语言基于领域分析的结果,开发团队和领域专家共同建立一套统一的业务语言。
这套语言应该准确、清晰地表达业务概念,避免歧义。
比如,对于“订单”这个概念,明确其包含的属性(如订单号、下单时间、支付状态等)和相关的操作(如创建订单、修改订单、取消订单等)。
3、划分限界上下文根据业务的复杂性和相关性,将整个业务领域划分为不同的限界上下文。
每个限界上下文都应该具有相对独立的业务职责和领域模型。
在电商系统中,可以划分为商品管理、订单处理、用户服务等限界上下文。
4、设计聚合和领域模型在每个限界上下文中,设计聚合和领域模型。
确定聚合根、实体和值对象,并定义它们之间的关系和业务规则。
领域驱动设计实践领域驱动设计的关注重⼼是领域,尤其在⾯对复杂的领域逻辑时,它总能够帮助我们很好地分析领域。
领域驱动设计的基础是领域建模。
Eric认为需要和领域专家良好地合作,从交谈中发现通⽤语⾔,找到领域的关键词。
领域建模是迭代的过程,根据逐渐深⼊的领域知识来精化模型。
不过,领域驱动设计并不排斥其他的分析技术,例如分析模式,或者通过测试驱动开发来引导我们找到问题域的领域模型。
领域建模并⾮领域驱动设计所独有。
在RUP中,领域建模就是⼀个⾮常重要的环节。
它是⼀种⽤例驱动的开发⽅法,通过获得的⽤例来帮助分析和设计⼈员寻找对象,以及对象之间的关系。
根据我个⼈的经验,我喜欢采⽤两种截然不同的⽅式来获得模型。
⼀种是⽤例驱动,⼀种则是测试驱动。
在得到初步的领域模型中,我会尝试利⽤领域驱动设计的思想为对象分类,找到实体、值对象、聚合以及服务对象,并通过分析对象的⽣命周期,为不同类型的对象建⽴资源库和⼯⼚对象。
本⽂将以⼀个读者⽿熟能详的图书馆管理系统作为我们要分析的领域,尝试讲解如何在项⽬开发中应⽤领域驱动设计。
我将选择⽤例驱动的⽅式来获得我最初的领域模型。
简单起见,我先给出分析领域的⽤例以及⽤例图。
借书:读者携带要借书籍到借书处。
图书馆⼯作⼈员⾸先扫描读者的借书卡,获得读者信息,然后扫描书籍的条形码。
如果借阅多本,则扫描多本书籍。
扫描时,需要判断当前读者的类型,获得读者可借书籍数。
如果借阅书籍超出,则提⽰。
如果扫描失败,允许⼯作⼈员⼿⼯输⼊编号。
借阅的期限为1个⽉。
还书:读者携带要还书籍到还书处。
图书馆⼯作⼈员扫描书籍的条形码,进⾏还书操作。
如果借阅的书籍超期,则提⽰,并计算出应收罚款的数额。
如果扫描失败,允许⼯作⼈员⼿⼯输⼊编号。
我采⽤了摘要⽅式来描述⽤例。
我喜欢这样⼀种简洁的⽅式,它实际上等同于XP中的⽤户故事。
在需求并不复杂的时候,或者在对⽂档要求并不严格的时候,都可以采⽤这种⽅式来编写⽤例。
以下是表达上述两个⽤例的⽤例图展现:可以⾸先利⽤名词/动词法找到模型中的领域对象。
领域驱动设计(DDD)架构的实践前言至少30年以前,一些软件设计人员就已经意识到领域建模和设计的重要性,并形成一种思潮,Eric Evans将其定义为领域驱动设计(Domain-Driven Design,简称DDD)。
在互联网开发“小步快跑,迭代试错”的大环境下,DDD似乎是一种比较“古老而缓慢”的思想。
然而,由于互联网公司也逐渐深入实体经济,业务日益复杂,我们在开发中也越来越多地遇到传统行业软件开发中所面临的问题。
本文就先来讲一下这些问题,然后再尝试在实践中用DDD的思想来解决这些问题。
问题过度耦合业务初期,我们的功能大都非常简单,普通的CRUD就能满足,此时系统是清晰的。
随着迭代的不断演化,业务逻辑变得越来越复杂,我们的系统也越来越冗杂。
模块彼此关联,谁都很难说清模块的具体功能意图是啥。
修改一个功能时,往往光回溯该功能需要的修改点就需要很长时间,更别提修改带来的不可预知的影响面。
下图是一个常见的系统耦合病例。
订单服务接口中提供了查询、创建订单相关的接口,也提供了订单评价、支付、保险的接口。
同时我们的表也是一个订单大表,包含了非常多字段。
在我们维护代码时,牵一发而动全身,很可能只是想改下评价相关的功能,却影响到了创单核心路径。
虽然我们可以通过测试保证功能完备性,但当我们在订单领域有大量需求同时并行开发时,改动重叠、恶性循环、疲于奔命修改各种问题。
上述问题,归根到底在于系统架构不清晰,划分出来的模块内聚度低、高耦合。
有一种解决方案,按照演进式设计的理论,让系统的设计随着系统实现的增长而增长。
我们不需要作提前设计,就让系统伴随业务成长而演进。
这当然是可行的,敏捷实践中的重构、测试驱动设计及持续集成可以对付各种混乱问题。
重构——保持行为不变的代码改善清除了不协调的局部设计,测试驱动设计确保对系统的更改不会导致系统丢失或破坏现有功能,持续集成则为团队提供了同一代码库。
在这三种实践中,重构是克服演进式设计中大杂烩问题的主力,通过在单独的类及方法级别上做一系列小步重构来完成。
DDD领域驱动设计落地实践六步拆解DDD 领域驱动设计(Domain-Driven Design,简称DDD)是一种通过深入理解业务领域的核心概念和规则,来影响软件设计的方法。
DDD的目标是将业务专家和技术人员之间的沟通缩小,从而实现更好的软件设计和架构。
在实践DDD时,可以采用以下六个步骤将DDD落地:第一步:理清业务领域首先,需要深入了解业务领域,并与业务专家进行密切合作。
这一步骤的目标是明确业务需求、领域知识、业务规则和相关概念。
可以使用领域建模工具(如UML类图、领域模型)来帮助理清业务领域。
第二步:划分领域在这一步骤中,将业务领域划分为不同的子领域。
子领域应该是有内聚性和自治性的。
通过划分子领域,可以更好地管理和组织复杂的业务。
第三步:确定限界上下文限界上下文是DDD中非常重要的概念,它定义了领域模型的边界和模块的职责。
在这一步骤中,需要明确每个子领域的限界上下文,并确定上下文之间的关系和依赖。
可以使用上下文映射图(Context Map)来帮助可视化上下文之间的关系。
第四步:建立领域模型在这一步骤中,需要根据业务需求和限界上下文,建立领域模型。
领域模型应该是业务专家和技术人员共同理解的模型,可以使用领域特定语言(Domain Specific Language,简称DSL)或UML类图等形式来表示。
第五步:实现领域模型一旦领域模型建立,就可以开始实现领域模型。
可以使用面向对象的编程语言(如Java、C#等)来实现领域模型,并采用DDD中的设计原则和模式(如聚合、实体、值对象、领域服务等)来帮助实现。
第六步:持续演化和迭代DDD是一个持续演化和迭代的过程。
在软件开发过程中,需求和业务规则可能会不断变化,因此领域模型也需要随之演化。
通过与业务专家的紧密合作,及时反馈和迭代,可以不断改进和优化领域模型。
总结起来,实践DDD的六个步骤分别是:理清业务领域、划分领域、确定限界上下文、建立领域模型、实现领域模型以及持续演化和迭代。
《领域驱动设计:业务建模与架构实践》阅读笔记目录一、书籍概述 (2)1.1 作者介绍及写作背景 (2)1.2 书籍内容概述 (3)1.3 领域驱动设计的重要性 (5)二、领域驱动设计基础 (6)2.1 领域驱动设计的核心概念 (7)2.1.1 领域模型的定义 (9)2.1.2 泛领域化与领域边界划定 (10)2.1.3 聚合与聚合根的理解 (11)2.2 业务建模方法论 (12)2.2.1 业务需求分析 (14)2.2.2 业务过程建模 (15)2.2.3 业务实体与关系分析 (16)三、领域模型构建实践 (18)3.1 确定业务核心领域与识别关键实体 (20)3.1.1 业务领域识别方法 (21)3.1.2 关键业务实体分析 (22)3.2 构建领域模型的具体步骤 (23)3.2.1 需求分析阶段 (25)3.2.2 概念建模阶段 (26)3.2.3 细化与调整阶段 (27)四、架构实践与应用场景分析 (29)4.1 架构风格选择与设计原则 (30)4.1.1 常见架构风格介绍与选择依据 (32)4.1.2 架构设计原则及最佳实践 (34)4.2 领域驱动设计在典型场景中的应用 (35)4.2.1 订单管理系统实例分析 (37)4.2.2 电商平台的领域驱动设计实践 (39)五、技术实现与工具选择建议 (40)5.1 领域模型的技术实现方式 (42)5.1.1 数据持久层技术选型建议 (44)5.1.2 业务逻辑层的技术实现要点 (45)5.2 辅助工具与最佳实践分享 (46)一、书籍概述《领域驱动设计:业务建模与架构实践》是一本深入探讨软件开发领域中业务建模与架构设计的书籍。
本书作者结合多年的从业经验,为读者提供了一套完整而实用的领域驱动设计(DDD)方法论和实践指南。
在书籍概述部分,作者首先阐述了领域驱动设计的核心理念和目的。
DDD是一种软件开发方法,它强调基于领域模型来构建软件系统,从而更好地理解和表达业务需求。
领域驱动设计实践教学案例一、教学背景。
想象一下,我们要教一群充满活力但又对复杂设计概念有点迷糊的学生领域驱动设计(DDD)。
传统的干巴巴讲解肯定不行,那咱们就来个有趣的宠物商店项目,让知识变得生动起来。
二、项目启动:了解宠物商店的世界。
1. 场景描绘。
咱们先和学生们一起幻想一个超级酷的宠物商店。
这个商店里有各种各样的宠物,像调皮的小猫咪,会汪汪叫的小狗狗,还有毛茸茸的小兔子。
还有照顾这些宠物的工作人员,比如热情的店员和专业的兽医。
然后我们问学生们,如果要管理这个宠物商店,需要考虑哪些东西呢?这就像是打开了话匣子,他们会开始七嘴八舌地说,要知道宠物的品种、价格,还要知道工作人员的排班等等。
2. 界定问题领域。
我们引导学生把这些杂乱的想法进行分类。
和宠物本身相关的信息(品种、年龄、健康状况等)是一个领域,商店的运营管理(库存管理、人员管理等)是另一个领域。
这就像是把一堆五颜六色的乐高积木按照形状和功能分类一样。
幽默地告诉学生:“如果把宠物商店看成一个大拼图,我们现在要找出每一块小拼图的样子,然后才能把这个大拼图拼好。
”三、实体与值对象的探索。
1. 宠物实体。
我们拿小猫咪举例。
小猫咪在宠物商店里是一个实体,它有自己独特的身份标识,就像它的名字或者宠物编号。
它还有很多属性,像它的品种(是布偶猫还是橘猫呢?)、年龄(是小奶猫还是已经成年的大猫?)、颜色(白色、黑色还是花色的?)。
对学生说:“这小猫咪就像一个小明星,有自己的名字牌(身份标识),还有一堆描述它的标签(属性)。
”2. 值对象。
再看宠物的价格。
宠物的价格不像宠物本身那样有一个单独的身份,它是依赖于宠物这个实体存在的。
如果一只橘猫的价格是500元,这个500元就是一个值对象。
它只表示橘猫的价格这个属性的值,而且这个值可能会随着市场供求关系而变化。
打趣地说:“这价格就像小猫咪的一件小外套,它可以换(价格可以变),而且它只属于这只小猫咪(依赖于宠物实体)。
领域驱动设计业务建模与架构实践1.引言领域驱动设计(D oma i n-Dr iv en De si gn,简称D DD)是一种以业务领域为核心的软件设计方法论,通过深入理解业务领域的本质和规则,将业务知识融入软件设计和开发的过程中。
本文旨在介绍领域驱动设计的概念与原则,并探讨在实际项目中如何进行业务建模与架构实践。
2.领域驱动设计概述领域驱动设计是由Er i cE va ns于2004年提出的软件设计方法论,其核心思想是将软件设计的重点从技术转移到业务领域上。
D DD通过与领域专家密切合作,共同理解业务知识和业务需求,并将其转化为可执行的软件模型。
通过将业务领域划分为多个子领域,DD D强调每个子领域的独立性和自治性,从而提高系统的灵活性和可维护性。
3.领域建模领域建模是领域驱动设计中的基础工作,通过对业务领域的分析和理解,建立起业务模型。
领域建模主要包括以下几个步骤:3.1.识别核心领域首先,需要识别出业务系统中的核心领域,即对业务成功至关重要的领域。
通过与领域专家的交流和分析,确定出主要的关键领域,并明确其范围和边界。
3.2.拆分子领域将核心领域进一步拆分为多个子领域。
每个子领域应该具有清晰的边界和自治性,既能够独立于其他子领域进行开发,又能够通过定义好的接口进行交互和合作。
3.3.建立领域模型在每个子领域中,通过领域模型的方式来描述业务中的概念、实体、关系和业务规则等。
领域模型是对业务领域知识的抽象和表达,它能够清晰地反映业务领域的本质和规则。
3.4.持续迭代优化领域建模是一个持续迭代的过程,随着对业务领域理解的不断深入和新需求的出现,需要对领域模型进行不断优化和演化,确保其与业务实际情况的一致性。
4.领域驱动设计架构实践领域驱动设计的架构实践是将领域模型转化为现实的软件架构,以实现系统对业务领域的支持和扩展。
4.1.领域服务通过将业务逻辑封装在领域服务中,我们能够更好地实现业务领域的自治性和独立性。
实践DDD领域驱动设计领域驱动设计(Domain-Driven Design,DDD)是一种软件开发方法论,旨在通过深入理解问题领域,将领域专家和开发团队紧密合作,以便构建高度可维护、健壮和可扩展的软件系统。
实践DDD方法可以帮助开发团队更好地理解问题领域,并将这些理解转化为系统的设计和实现。
DDD方法着重强调领域模型的重要性。
领域模型是对问题领域知识的抽象和概括,并用于指导软件系统的设计。
在实践DDD时,以下是一些关键的步骤和注意事项:1.领域建模:通过与领域专家的沟通和合作,了解问题领域的关键概念、业务规则和流程。
将这些知识转化为领域模型,包括实体、值对象、聚合根和领域服务等概念。
2.划分边界:将领域模型划分为不同的子域,每个子域表示系统中独立的业务领域。
划分子域有助于将系统分解为更小的、可扩展的模块,并提高开发的效率。
3.战略设计:在战略设计中,确定子域的边界和上下文,定义每个子域的约束和限制。
这有助于区分核心子域和支持子域,并明确各个子域之间的关系。
4.模型驱动设计:通过领域模型指导系统的设计和实现。
定义实体和值对象的属性和行为,使用聚合根保护领域的一致性和完整性。
5.战术设计:在战术设计中,使用设计模式和原则来解决具体的技术问题,例如使用聚合根、实体和值对象之间的关系,定义领域服务和领域事件等。
6.持续迭代和迭代优化:DDD是一个迭代的过程,开发团队需要不断地与领域专家进行沟通和反馈,逐步完善和优化领域模型和系统设计。
1.高度可维护性:通过领域模型的清晰定义和可靠性,系统的可维护性得到显著改善。
开发团队可以更容易地理解和维护领域模型,而不会受到实现的细节的干扰。
2.模型驱动开发:使用领域模型指导系统的设计和实现,可以减少开发过程中的误解和不一致,提高开发效率和质量。
3.增强团队合作:DDD强调开发团队与领域专家之间的紧密合作和沟通。
这样可以提高开发团队的理解和洞察力,并减少开发过程中的冲突和误解。
领域驱动设计的实践和应用领域驱动设计(Domain-Driven Design)被视为是软件开发的一种新范式,是归纳出规律、提升软件开发效率的一种方法。
领域驱动设计描述了如何将软件开发与业务需求相结合,因此赢得了软件开发者的热情关注。
本文将探讨领域驱动设计的实践和应用。
一、领域驱动设计的基础理论领域(Domain)是指边界,软件系统需要解决的问题属于特定的范围。
领域即为这个范围,它决定了如何描述和组织软件。
在软件设计中,无论是桌面应用程序还是Web应用程序,都有一个定义良好的领域。
领域驱动设计尝试解决的问题是:如何在不同的领域中构建有用和可维护的软件系统。
在领域驱动设计的实践中,需要关注的是业务问题和数据处理,特别是在复杂的系统中,这些问题常常难以直接映射到软件设计的架构中。
领域驱动设计致力于提高设计的效率,通过将软件设计与实际业务需求相结合,确保系统能够满足客户的需求和期望。
二、领域驱动设计的实践方法1. 了解业务需求领域驱动设计的第一步是了解业务需求,我们需要了解用户的想法和需求,以及这些需求的来源和关联。
这一步是最关键的一步,它需要和客户进行沟通,在整个开发周期中保持交流,以便更快地了解业务需求变化。
2. 设计领域模型领域模型是描述如何处理数据和业务问题的一个框架。
它是领域驱动设计的核心概念,在这一过程中,我们需要专注于业务问题,并尝试在模型中抽象出关键的概念和概念之间的关系。
设计模型时应该尽量简单明了、易于理解,减少模型中的不必要的细节。
3. 实现领域模型实现领域模型时,需要关注业务逻辑和核心功能的实现。
该步骤涉及到数据存储和数据操作,以及与外部系统交互。
在实现过程中,需要注意模型和实现的一致性,确保模型反映真实的业务需求。
4. 整合系统领域驱动设计的最终目标是在系统中实现业务功能。
在整个开发周期中,需要进行持续的集成和部署,确保系统在不断变化的业务需求中保持一致和稳定。
同时也需要关注系统的可维护性,在长期的维护中不断完善和优化系统。
DDD领域驱动设计实践领域驱动设计(Domain Driven Design,DDD)是一种软件开发的方法论,它强调的是软件开发过程中需要将业务领域专家和技术团队之间的理解进行深度沟通,从而将业务领域的复杂问题转化为开发过程能够理解和处理的模型。
DDD的核心思想是将业务逻辑和技术实现分离,将业务领域的模型映射到代码中,从而使代码具有更高的可维护性、扩展性和可重用性。
在实践中,我们需要对DDD的各个方面进行深入了解和应用。
下面是一些关键点。
1. 了解业务领域模型在DDD的实践中,首先需要了解和分析业务领域的模型,其中包括领域概念、业务规则、业务流程等。
这是因为在软件开发过程中,我们需要对业务领域模型进行深入理解,从而处理业务领域的复杂问题,并将其映射到代码实现中。
2. 使用Ubiquitous LanguageUbiquitous Language是一种在业务领域模型中使用的共同语言,它是所有业务参与者都能够理解和沟通的统一语言。
在DDD中,我们需要使用Ubiquitous Language来描述业务领域的模型,确保所有参与者都能够理解和认可该模型,从而减少在开发过程中出现的理解和沟通障碍。
3. 划分子域划分子域是DDD中的一个关键概念,它将业务领域模型划分为若干个独立的子域,每个子域包含一组相关的业务概念和业务规则。
通过划分子域,可以将复杂的业务领域模型分解为一些更加易于理解和处理的部分,从而提高开发效率和质量。
4. 设计领域层模型领域层是DDD中非常重要的一部分,它主要负责处理业务领域的问题,在其中应用领域模型。
在设计领域层模型时,需要考虑以下几个方面:(1)设计领域模型,包括实体、值对象、聚合、事件等。
(2)实现领域服务,为应用层提供统一的领域逻辑。
(3)实现领域事件,用于解耦领域层和其他层之间的关系。
(4)遵循领域驱动设计原则,保证模型的合理性和可扩展性。
5. 实现应用层服务应用层是DDD中另一个重要的概念,它负责接收用户请求,并调用合适的领域层服务来处理业务逻辑。
领域驱动设计(DDD)是一种软件设计方法,它强调将领域专家和开发人员紧密合作,以构建精确、一致的模型来捕捉业务实体及其关系。
在实践中,DDD领域模型设计可以按照以下步骤进行:
1. 确定核心域:首先需要确定系统设计的核心域,这个核心域通常是最具代表性的业务领域,也是系统设计的关键部分。
2. 定义实体:在核心域中,定义实体以及实体的属性,这些实体是业务领域中的对象,具有可标识性、状态和行为。
3. 建立领域模型:根据实体之间的关系,建立领域模型。
领域模型包括聚合、聚合根、值对象等概念,这些概念可以描述业务领域的状态和行为。
4. 设计数据访问对象(DAO):DAO是领域模型的数据访问对象,它负责数据的持久化存储和访问。
在DDD中,每个实体都有一个对应的DAO,用于实现对实体的增删改查等操作。
5. 实现服务层:在DAO之上,实现服务层。
服务层利用DAO 实现具体的业务逻辑,例如增删改查等操作。
6. 映射数据库表:根据领域模型的设计,将实体映射到数据库表中。
在映射过程中,需要遵循数据库表的规范,如数据类型、字段长度等。
7. 测试和验证:最后,对设计的领域模型进行测试和验证,确保模型的准确性和一致性。
测试和验证可以通过单元测试、集成测试和系统测试等方式进行。
通过以上步骤,可以逐步建立起领域驱动设计的领域模型,从而更好地支持业务需求和系统设计。
需要注意的是,DDD领域模型设计需要不断迭代和优化,以适应业务需求的变化和技术发展的趋势。
领域驱动设计(DDD)实践之路(四)领域驱动在微服务设计中的应用领域驱动设计(Domain-Driven Design, DDD)是一种软件开发方法论,着重于将业务逻辑与软件设计相结合,以实现可靠、可扩展、可维护的软件系统。
在微服务架构设计中,DDD能够提供一种有效的方法来划分领域边界,并促进微服务的可独立开发、部署和升级。
在微服务架构中,每个微服务都是一个独立的、自治的组件,负责处理领域内的一部分业务逻辑。
领域驱动设计可以帮助我们识别和定义每个微服务的领域边界。
通过聚焦每个微服务的业务核心,我们可以将复杂的系统拆分为一系列互相协同合作的微服务。
在微服务设计中,常见的问题是如何定义微服务的边界和交互方式。
DDD中的领域模型可以帮助我们回答这些问题。
通过将领域模型映射到微服务之间的接口和交互,我们可以更好地理解和划分微服务的边界。
同时,领域驱动设计还提供了一些设计模式和技术,如聚合根、值对象、事件驱动等,用于解决微服务之间的复杂性和交互问题。
另一个微服务设计中的重要问题是如何管理领域模型的一致性。
在微服务架构中,每个微服务都有自己的数据库,因此领域模型需要在不同的微服务之间进行同步和共享。
DDD中的领域事件可以帮助我们解决这个问题。
通过将领域事件作为微服务之间的消息传递机制,我们可以实现领域模型的一致性和同步。
此外,领域驱动设计还可以帮助我们解决微服务架构中的其他挑战,如数据一致性、数据迁移、分布式事务等。
通过在领域模型中定义正确的聚合根和值对象,并使用适当的设计模式和技术,我们可以更好地管理和处理这些问题。
最后,领域驱动设计在微服务设计中的应用需要结合实际场景和业务需求进行判断和选择。
不同的业务领域和系统架构可能需要不同的设计方法和技术。
因此,在应用DDD的同时,我们还需要考虑业务的特点、团队的能力和项目的需求,来选择合适的设计方法和技术。
总之,领域驱动设计在微服务设计中的应用可以提供一种有效的方法来划分领域边界、管理领域模型的一致性,并解决微服务架构中的其他挑战。
软件架构中的领域驱动设计(DDD)领域驱动设计(DDD)是一种软件架构方法,旨在在设计和开发软件系统时,通过深入理解业务领域和将领域模型融入设计中,实现更加高效的系统开发和更好的业务需求实现。
在本文中,我们将详细探讨领域驱动设计的概念、原则、实践和优势,以及在实际项目中如何应用和实施DDD。
一、领域驱动设计概念领域驱动设计是由埃里克·埃文斯(Eric Evans)在其著作《领域驱动设计:软件核心复杂性应对之道》中首次提出的。
领域驱动设计的核心概念是将业务领域的知识和逻辑融入到软件设计和开发中,以实现更加贴近业务需求的系统构建。
在DDD中,领域模型是关键的组成部分,它代表了对业务领域知识的深入理解和抽象,是软件系统的核心。
二、领域驱动设计原则1.模型驱动:领域模型是系统设计的核心,所有的设计与开发工作都要围绕领域模型展开。
2.领域专家参与:在领域驱动设计中,需要业务领域的专家参与,帮助建模和设计。
这样可以确保系统能够准确地反映业务需求。
3.共享语言:领域模型应该是开发团队和业务专家之间的共同语言,确保沟通和理解的准确性。
4.划分领域边界:将业务领域划分为不同的子领域,每个子领域有自己的领域模型和边界,可以更好地组织和管理系统的复杂性。
三、领域驱动设计实践1.领域建模:通过与业务专家合作,建立领域模型,包括实体、值对象、聚合、领域服务等,描述业务逻辑和知识。
2.领域驱动设计模式:使用DDD提供的一些设计模式,如实体、值对象、领域服务、聚合根等,来组织和表达领域模型。
3.领域事件驱动架构:在领域驱动设计中,事件是一个重要的概念,可以帮助系统解耦和实现松耦合的设计。
4.领域驱动设计工具:有一些工具可以帮助开发团队进行领域驱动设计,如UML建模工具、领域建模工具等。
四、领域驱动设计优势1.高内聚低耦合:DDD强调领域模型的设计与实现,可以更好地实现高内聚低耦合的系统设计。
2.更好的业务实现:领域模型是对业务领域的深入理解和总结,可以更好地满足业务需求。
领域驱动设计实践2010-08-27 作者:张逸来源:张逸的blog领域驱动设计的关注重心是领域,尤其在面对复杂的领域逻辑时,它总能够帮助我们很好地分析领域。
领域驱动设计的基础是领域建模。
Eric认为需要和领域专家良好地合作,从交谈中发现通用语言,找到领域的关键词。
领域建模是迭代的过程,根据逐渐深入的领域知识来精化模型。
不过,领域驱动设计并不排斥其他的分析技术,例如分析模式,或者通过测试驱动开发来引导我们找到问题域的领域模型。
领域建模并非领域驱动设计所独有。
在RUP中,领域建模就是一个非常重要的环节。
它是一种用例驱动的开发方法,通过获得的用例来帮助分析和设计人员寻找对象,以及对象之间的关系。
根据我个人的经验,我喜欢采用两种截然不同的方式来获得模型。
一种是用例驱动,一种则是测试驱动。
在得到初步的领域模型中,我会尝试利用领域驱动设计的思想为对象分类,找到实体、值对象、聚合以及服务对象,并通过分析对象的生命周期,为不同类型的对象建立资源库和工厂对象。
本文将以一个读者耳熟能详的图书馆管理系统作为我们要分析的领域,尝试讲解如何在项目开发中应用领域驱动设计。
我将选择用例驱动的方式来获得我最初的领域模型。
简单起见,我先给出分析领域的用例以及用例图。
借书:读者携带要借书籍到借书处。
图书馆工作人员首先扫描读者的借书卡,获得读者信息,然后扫描书籍的条形码。
如果借阅多本,则扫描多本书籍。
扫描时,需要判断当前读者的类型,获得读者可借书籍数。
如果借阅书籍超出,则提示。
如果扫描失败,允许工作人员手工输入编号。
借阅的期限为1个月。
还书:读者携带要还书籍到还书处。
图书馆工作人员扫描书籍的条形码,进行还书操作。
如果借阅的书籍超期,则提示,并计算出应收罚款的数额。
如果扫描失败,允许工作人员手工输入编号。
我采用了摘要方式来描述用例。
我喜欢这样一种简洁的方式,它实际上等同于XP中的用户故事。
在需求并不复杂的时候,或者在对文档要求并不严格的时候,都可以采用这种方式来编写用例。
以下是表达上述两个用例的用例图展现:可以首先利用名词/动词法找到模型中的领域对象。
这种方法虽然极度地简单与低级,然后在建立领域模型之初,是非常有效的手段。
通过对用例的分析,大致可以获得如下对象:Reader,Administrator,Book,Library Card以及Scanner。
也许还有我们未曾发现的领域对象,这可以通过深入领域或与客户交谈来进一步获得。
我们可以尝试着先获得一个最简单的领域模型,如下所示。
我们发现Administrator对象是一个孤立的对象,它与其他领域对象没有产生任何关系。
至少在借书、还书用例中,我们并不需要管理这个对象,可以考虑删除它。
模型中的Scanner对象非常特殊,表面上它会对Book与LibraryCard进行操作,然而对于Scanner而言,它并不关心操作的是什么对象,而只需要扫描条形码,返回一个字符串。
这是一种行为的体现。
在整个系统中,Scanner对象可以只拥有一个,没有属性和状态,仅提供扫描功能,或者说是服务,因此可以考虑将其定义为服务对象。
Reader与Book之间的关系非常直接,可是在引入LibraryCard之后,这个关系就显得有些尴尬了。
仔细阅读用例,我们发现识别读者的信息,是通过借书卡来获取的。
无论是借书还是还书,都可以通过借书卡来获得读者当前借阅的书。
此时,读者与书之间就不存在任何关系了,它已经进行了转嫁。
既然借书卡已经实现了对借书关系的管理,我们还有必要保留Reader对象吗?阅读用例,我们知道在扫描借书卡时,会获得读者的信息。
虽然我们可以在借书卡中保留这些信息,但根据单一职责原则(SRP),将其专门封装为一个对象仍有必要。
目前,借书卡仅仅维护了读者当前借阅的书籍,那么,还需要维护借阅和返还的历史记录吗?从用例的描述来看,并没有这一功能。
我们感到疑惑,因为保留历史记录是大多数系统所必备的。
此时,客户的答案就显得格外重要。
“哦,是的,我们需要查看历史记录!”这是客户给我们的肯定答复。
显然,查看历史记录属于另一个用例,它甚至可能属于另外一个上下文(Context),例如关于“查询”的上下文。
然而,这一信息的来源却来自于借阅与返回用例,我们应该将其识别出来。
如果其他用例需要用到,我认为这个对象是需要共享的。
细化后的领域模型如下:通过对扫描行为的分析,我认为Scanner提供的扫描行为与领域无关,而是一种基础设施,因此我将其定义为基础设施层的服务。
模型增加了FineCalculator对象,用以完成对超期读者的罚款金额计算。
显然,它是一个服务对象。
注意,BorrowingHistory与Book是一对一的关系,因为我们需要为每一本书建立一条借阅历史记录。
现在,我们需要识别领域模型中的实体和值对象,以及可能的聚合。
我们需要一个唯一的标识来区别读者,且这一标识具有连续性,因此Reader是一个实体对象。
同样,Book对象也是一个实体对象,因为我们需要一个唯一标识来完成对书籍的跟踪。
注意,在这个模型中的Book实体,其实例代表的是具体的某一本书,而不是指同一种书。
因为图书馆可能就同一种书购买多本,而读者借阅的是真实的书本,而不仅仅是书的属性。
此时,Book的标识ID就显得尤为重要,甚至不能用书籍的ISBN来标识。
从表面上看,BorrowingHistory同样属于实体对象,它的每一条记录都是唯一的,即使存在两条历史记录,具有相同的读者ID与书籍ID,我们仍将其视为不同的记录,因为它们的借阅时间并不相同。
不过,对于系统的调用者而言,通常不会去关注所有的借阅记录,而是查询某位读者的借阅记录,因此,我们可以将其作为与Reader放在一起的聚合。
然而,随着对需求的深入分析,我们发现定义这样的聚合存在问题,因为我们可能还需要查询某本书的借阅记录(例如,希望知道哪本书最受欢迎,跟踪每本书的借阅情况等)。
由于Reader和Book应该分属于不同的聚合,BorrowingHistory就存在无法划定聚合的问题。
既然如此,我们应该将其分离出来,作为一个单独的聚合根。
让人感觉疑惑不解的是LibraryCard对象。
一方面,它的ID来源于Reader,且存在一对一的关系,因此它可以作为Reader聚合的一部分。
根据模型图来看,它实际上又记录了读者与书之间的关系。
仔细分析,LibraryCard所维护的这样一种读者与书的关系,事实上正是BorrowingHistory的一种体现,区别仅在于一个记录了当前的借书信息,一个还包括过去的借书信息。
BorrowingHistory可以进行信息的持久化,LibraryCard则完全可以在内存中维持一个当前借阅信息的集合。
因此,可以将LibraryCard定义在Reader 聚合中。
这样既可以减少对象之间的关联,又能保证对象之间的一致性。
我们还需要深入分析Reader对象和Book对象的标识ID,因为这两者的标识ID都是通过基础设施的Scanner服务获得的。
Scanner并没有能力知道二者之间的区别。
而在借阅书籍时,根据需求规定的流程,必须是先扫描借书卡,获得读者信息,然后再扫描书。
此外,当扫描出现错误时,系统需要支持操作人员手工输入,因此对手工输入的内容也需要进行ID的验证。
我们需要有专门验证ID的对象。
我们还要考虑许多业务规则,例如是否允许读者借书的规则,是否超期的规则,计算罚款额度的规则。
如果这些规则极为简单,且不具有变化的可能,可以放在领域对象中。
然而,一旦规则变得复杂,就会严重干扰相关领域对象的职责。
根据职责分离的原则,我们可以提供专门的规则对象,即领域驱动设计中规格模式的应用。
如果可能变化,我们甚至可以引入策略模式,对这些规则进行抽象。
经过分析后得到的领域模型如下所示:Reader实体对象和LibraryCard实体对象处于同一个聚合中,其中Reader为聚合根。
BorrowingSpecification和ReturningSepecification均为值对象,并放在Reader聚合中。
FineCalculator 是一个服务对象,它会调用FineRule值对象获得罚款规则,通过计算后返回Money值对象值。
由于聚合的原因,原来FineCalculator与LibraryCard之间的关系已经修改为计算Reader的罚款。
BorrowingHistory和Book均为实体对象,而IdentityValidator则为服务对象,负责验证扫描码。
接下来需要为领域对象选择资源库(Repository)。
在领域模型中,只有Reader、BorrowingHistory和Book三个实体为聚合根对象,因此只需要为这三个对象建立资源库对象即可。
由于需求较为简单,建立的领域模型已经比较完善,我们可以着手编码,对这些模型进行验证。
本文没有考虑限定上下文的情况,我希望未来的文章能够以真实的案例对此进行表述。
整体而言,根据这个案例,我们已经能够初步领略领域驱动设计的基本步骤。
细说业务逻辑2010-08-02 作者:张洋来源:EricZhang's Tech Blog前言记得几个月前,在一次北京博客园俱乐部的活动上,最后一个环节是话题自由讨论。
就是提几个话题,然后大家各自加入感兴趣的话题小组,进行自由讨论。
当时金色海洋同学提出了一个话题——“什么是业务逻辑”。
当时我和大家讨论 MVC的相关话题去了,就没能加入“业务逻辑”组的讨论,比较遗憾。
其实,一段时间内,我脑子里对“业务逻辑”的概念也是非常模糊的。
但在不断地阅读、思考和实践过程中,这个概念及其相关的内容才在我脑子里渐渐清晰。
我想,很多朋友也许也对这个概念不是很了解,所以愿意结合既有资料和自己的思考,总结一篇关于业务逻辑的概述性文章,一则与朋友们分享探讨,二则也是为自己对业务逻辑的学习做一个总结和提升。
因为我还不敢说对业务逻辑内涵及外延理解的非常充分,所以文中如有不当之处,还请各位不用客气,尽管批评就好!内容提要===================前篇=====================前言内容提要1、我把业务逻辑丢了!——找回丢失的业务逻辑2、细说业务逻辑2.1、业务逻辑到底是什么2.2、业务逻辑的组成结构2.2.1、领域实体(Domain Entity)2.2.2、业务规则(Business Rules)2.2.3、完整性约束(Validation)2.2.4、业务流程及工作流(Business Processes and Workflows)2.3、业务逻辑层职责相关争议2.3.1、争议一:数据的格式化2.3.2、争议二:数据合法性及完整性验证2.3.3、争议三:CRUD2.3.4、争议四:存储过程===================后篇=====================3、业务逻辑的架构模式及实现3.1、Transcaton Script3.1.1、概述3.1.2、分析3.2、Table Module3.2.1、概述3.2.2、分析3.3、Active Record3.3.1、概述3.3.2、分析3.4、Domain Model3.4.1、概述3.4.2、分析3.5、各种架构模式的比较及选择4、结束语参考文献1、我把业务逻辑丢了!——找回丢失的业务逻辑相信朋友们基本都是软件开发人员。