范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

ThinkinginDDD(二)

  DDD的落地,主要有三个方面需要理清:第一,以何种应用架构进行落地;第二,核心组件及其生命周期,相互之间的交互逻辑;第三,不同限界上下文之间如何集成。
  本文将重点分析DDD落地的应用架构,其余两个方面后续会专门去展开。
  DDD的实现架构有很多,有经典四层架构、六边形(适配器端口)架构、整洁架构(clean architecture)、CQRS架构等,相信很多读者跟我刚开始接触时一样,完全不知道该选择什么架构进行落地。
  本文不会逐个去讲解这些架构,而是从我们日常的三层架构出发,带领大家思考适合我们落地的架构。
  我们很多项目是基于三层架构的,其结构如图:
  我们说三层架构,为什么还画了一层Model呢?因为Model只是简单的Java Bean,里面只有数据库表对应的属性,有的应用会将其单独拎出来作为一个maven模块。
  接下来我们开始对这个三层架构进行抽象精炼。 第一步,数据模型与数据访问层(持久层)合并
  为什么数据模型要与数据访问层合并呢?首先,数据模型与数据库表结构的字段是一一对应的,数据模型最主要的应用场景就是持久层用来进行ORM,给Service层返回封装好的数据模型,供Service执行业务;其次,数据模型的Class或者属性字段上,通常带有ORM框架的一些注解,跟持久层联系非常紧密,根据单一职责的原则,我认为数据模型就是持久层拿来查询或者持久化数据的,数据模型脱离了持久化层,意义不大。 第二步,从Service抽取业务逻辑
  常见的Service方法,既有缓存、数据库的调用,也有实际的业务逻辑,整体过于臃肿。
  先看现在的Service方法的伪代码: public void businessLogic(Param param){  if(checkParam(param)){    throw new XXXException();  }  Data data=new Data();//或者是mapper.queryOne(param);    data.setId(param.getId());    if(condition1=true){    biz1=biz1(param.getProperty1())    data.setProperty1(biz1);  }else{    biz1=biz11(param.getProperty1())    data.setProperty1(biz1);  }  if(condition2=true){    biz2=biz2(param.getProperty2())    data.setProperty2(biz2);  }else{    biz2=biz22(param.getProperty2())    data.setProperty2(biz2);  }  //一堆set方法  ……  mapper.updateXXXById(data);  cache.del(data);//删除缓存  mpPublisher.publish(data);//发出消息}
  这是典型的事务脚本的代码:先做参数校验,然后通过biz1、biz2等子方法做业务,并将其结果通过一堆Set方法设置到数据模型中,再将数据模型更新到数据库。
  由于所有的业务逻辑都在Service方法中,造成Service方法非常臃肿,Service需要了解所有的业务规则,并且要清楚如何将基础设施串起来。同样的一条规则,例如if(condition1=true),很有可能在每个方法里面都出现。
  我们知道,专业的事情就该让专业的人干。既然业务逻辑是跟具体的业务场景相关的,我们想办法把业务逻辑提取出来,形成一个模型,让这个模型的对象去执行具体的业务逻辑,即提供业务能力。这样,Service方法就不用再关心里面的if/else业务规则,只需要给业务模型执行的舞台,并提供基础设施完成用例即可。
  将业务逻辑形成模型了,这样的模型,就是领域模型。
  我们先不管领域模型怎么得到,总之,拿到Service方法的入参之后,我们通过某种途径得到一个模型,我们让这个模型去做业务逻辑,最后执行的结果也都在模型里,我们再将模型写回数据库,当然,怎么写数据库的我们也先不管。
  抽取之后,将得到如下的伪代码: public void businessLogic(Param param){  if(checkParam(param)){    throw new XXXException();  }  Domain domain=loadDomain(param);    domain.doBusinessLogic();  saveDomain(domain);  cache.del(domain);//删除缓存  mpPublisher.publish(domain);//发出消息}
  根据代码,我们已经将业务逻辑抽取出来了,领域相关的业务规则封闭在领域模型内部。此时 Service方法非常直观,就是获取模型、执行业务逻辑、保存模型,再协调基础设施完成其余的操作。
  抽取完领域模型后,我们工程的结构如下图:
  第三步,维护领域对象生命周期
  在第二步中,loadDomain、saveDomain两个方法还没有得到讨论,这两个方法跟领域对象的生命周期息息相关。
  不管是loadDomain还是saveDomain,我们一般都要依赖于数据库或者其他中间件,所以这两个方法对应的逻辑,肯定是要跟DAO产生联系的。而保存或者加载领域模型,我们可以抽象成一种组件,这种组件就是Repository。
  注意,Repository加载或者保存领域模型,方法的入参或者出参,一定是基本数据类型或者领域内定义的类型,而不能是表数据模型。
  以下是Repository的伪代码: public interface DomainRepository{    void save(Domain domain);  Domain load(DomainId id);//假设是领域模型ID,也可能是其他的入参}
  既然DomainRepository与底层数据库有关联,但是我们现在DAO层并没有引入Domain这个包,DAO层自然无法提供DomainRepository的实现,我们初步考虑可以将这个DomainRepository实现在Service中。
  我们再推敲推敲,如果我们在Service中实现,势必需要在Service中操作数据模型:查询出来数据模型再封装为领域模型、或者将领域模型转为数据模型再通过ORM保存,但这个过程不该是Service层该关心的。
  所以,我们决定在DAO层直接引入Domain包,并在DAO层提供DomainRepository接口的实现,DAO层的Mapper查询出数据模型之后,封装成领域模型供DomainRepository返回。
  此时DAO层不再向Service返回数据模型,而是返回领域模型。
  现在,我们项目的架构图是这样的了:
  第四步,泛化
  在第三步中,我们的架构图已经跟经典四层架构非常相似了,我们再把格局放大点,对整个架构进行泛化抽象。
  首先,DAO层其实属于基础设施层,只不过其职责是持久化和加载聚合,所以,我们将DAO层改名为Infrastructure-Persistence,可以理解为基础设施层持久化包。之所以采取这种Infrastructure-XXX的格式进行命名,是由于Infrastructure可能会有很多的包,分别提供不同的基础设施支持。 一般的项目,还有可能需要引入缓存,例如Redis,我们就可以再加一个包,名字叫Infrastructure-Cache或者Infrastructure-Redis。
  注意:为了确保领域层知识的完备,Infrastructure层应该实现Domain层定义的基础设施接口,而不是向上层提供没有在领域层定义过的组件。
  然后,Controller层其实就是用户接口层,即User Interface层,我们在项目叫Interfaces 。Controller层 的名字有很多,有的叫Rest,有的叫Resource,考虑到我们这一层不只是有Rest接口,还可能还有一系列的拦截器,所以我一般比较随意的称之为Web。因此,我们将其改名为Interfaces-Web,即用户接口层的Web包。同样,我们可能会有很多的用户接口,但是他们通过不同的协议对外提供服务,因而被划分到不同的包中。我们如果有对外提供的RPC服务,那么其服务实现类所在的包就可以命名为Interfaces-Provider。
  有时候引入某个中间件,既会增加Infrastructure也会增加Interfaces。例如,如果引入Kafka就需要考虑一下,如果是给Service层提供调用的,例如逻辑执行完发送消息通知下游,那么我们再加一个包Infrastructure-Publisher;如果是消费Kafka 的消息,然后调用Service层执行业务逻辑的,那么就可以命名为Interfaces-Subscriber。
  最后,Service层目前已经没有业务逻辑了,业务逻辑都在Domain层去执行了,Service只是提供了应用服务,用于将领域的业务逻辑、领域服务封装为用例,所以,我们把Service层改名为Application层。
  经过第四步的抽象,其架构图为:
  在这个架构图中,经典四层架构的四层都出现了,整个架构图长得跟六边形架构也很像。这是为什么呢?其实,不管是经典四层架构、还是六边形架构,亦或者整洁架构,都是对系统应用的描述,也许描述的侧重点不一样,但是描述的是同一个事物。既然描述的是同一个事物,长得像才是理所当然的。
  对于任何一个应用,都可以看成"输入-处理-输出"的过程。
  "输入"环节:通过某种协议对外暴露领域的能力,这些协议可能是REST、可能是RPC、可能是MQ的监听器,也可能是WebSocket,也可能是一些任务调度的Task;
  "处理"环节:处理环节是整个应用的核心,代表了应用具备的核心能力,是应用的价值所在,应用在这个环节执行业务逻辑。
  "输出"环节,业务逻辑执行完成之后将结果输出到外部。
  不管我们采用的什么架构,其描述的应用的核心都是这个过程。正如《金刚经》所言:一切有为法,如梦幻泡影,如露亦如电,应作如是观;凡有所相,皆是虚妄;若见诸相非相,即见如来。 第五,完整的包结构
  将第四步中出现的包进行整理,并加入启动包,则得到如下完整的包结构。
  由于有很多的User Interface,所以启动类应该存放在单独的模块中,又因为application这个名字被应用层占用了,所以将启动类所在的包命名为launcher。
  包结构如图所示:
  至此,DDD项目的整体结构基本讲完了。

气候危机加速冰川融化专家警告多座冰川将在数十年内消失气候危机正在加速全球冰川的消逝。瑞士的研究人员日前发表研究称,自1931年以来,瑞士冰川消失了超过60。今年随着北半球多地刷新高温纪录,冰川消融的速度可能还将进一步加快。当地时间2Q2中国高端智能手机份额排行苹果vivo华为前三IT之家8月24日消息,今日,CounterpointResearch发布报告称,中国高端智能手机市场(批发价400美元约合人民币2750元及以上)的销量份额从2021年第二季度的用户关怀比肩苹果!四大隐私守护功能齐上阵,国产品牌让人安心对于消费者来说,手机的综合实力并非影响人们购机决定的唯一因素,有时候品牌提供的用户关怀服务也会对人们的购机意愿产生影响。正因如此,很多品牌都会在用户关怀方面倍下功夫,比如苹果和魅族天玑9000游戏手机跑分出炉博主数码闲聊站晒出了ROG天玑9000游戏手机的安兔兔跑分。天玑9000CPU部分成绩突破了29万分,骁龙8CPU成绩在25万分左右。GPU跑分方面,天玑9000成绩是43万多分,游戏代表速度反应挑战,一镜到底有时候动作游戏能给我们带来高强度的竞技刺激,有时候能给我们带来连招的快乐体验,有时候我们就是喜欢动作游戏带来的超高速反应挑战。接连出招的快感,通过一系列关卡的成就感,以及动作游戏带3DM速报燕云十六声国产武侠现科隆,死亡岛2秽土转生明年卖开放世界,国产武侠,RPG?大半夜的,惊了。1开放世界全平台!燕云十六声国产武侠现科隆在今天凌晨举办的2022科隆游戏展开幕之夜直播活动上,众多游戏作品都找准了这个宣传档口,公开了让大朋友小朋友都着迷的奇幻世界每个人都有一个梦,成为英雄驰骋沙场,或者成为明星绽放国际舞台,不过要实现这个梦想有很多不同的途径,也要付出很多的努力。法国作家福吉希望成为一个冒险家,他把自己的梦想放到了福吉和毛毛晨起怎么喝水,5大方法学起来早上起来的第一杯水,对于身体是很重要的。早上的这杯水可以起到很不错的养生效果,但是我们早上的第一杯水到底该喝什么呢?早起喝什么水?1。蜂蜜水吗?蜂蜜水有很不错的通便润肠的作用,但是过敏性鼻炎用生理盐水洗鼻子有效果吗过敏性鼻炎怎样脱敏治疗呢春天是万物复苏的季节,这个季节让人觉得很有活力,但很多人不太喜欢中国的春节。由于我们的春天是变应性鼻炎高发季节,变应性鼻炎患者容易引起学生的一系列不适症状,如鼻塞鼻涕打喷嚏鼻子发痒肝不好,人易倒,肝不好有这5种表现,教你5种中成药,养肝调肝大家好,我是沈医生。有句俗话叫做肝不好,人易倒。这是为什么呢?因为肝主全身气机的疏泄,而且肝主藏血,肝主筋,肝开窍于目,可以看出来我们身体的好多器官和功能,都和肝离不开关系。所以就1杯元气水大肚腩朋友不要错过在这里我给大家分享一杯,适合黄胖子的元气水,脾胃虚弱难掉秤的黄胖子们,一定不要错过哟,如果您也是面色发黄容易冒油,大肚腩腹型肥胖,上半身呢怕热下半身又怕冷,一补就上火,大便呢还容易简阳亿联国际商贸城二期项目有序推进智慧大馆入驻率达80以上简阳市融媒体中心简阳市委工作会议指出要把项目作为推动高质量发展的综合载体有效抓手,加快推进现代化基础设施体系建设和重大产业项目招商引资及落地建设。目前,简阳亿联国际商贸城二期项目正一两块钱一袋的牛黄解毒片,除了能清热解毒,还能治疗6种问题一两块钱一袋的牛黄解毒片可不能小觑,大家好,我是和医生,这牛黄解毒片大家肯定都不陌生,小时候几毛钱一袋,现在也就一两块钱,清热解毒,便宜有效,但是就是这么便宜的牛黄解毒片啊,除了清游客为什么不来云南了?矫枉过正自我污名还是邻居下蛊?游客为什么不来云南了?当这个问题成为热搜后,在云南的所有人都不禁反问,已经要把25度气温挤高3度的的游客,难道不是人?在这个神奇热搜的背后,我们发现了本土媒体猪队友的乌龙,长期以来整容后竟然眼睛闭不合了,四川姑娘眼整形失败还能做双眼皮修复吗一位来自四川的姑娘,在外院做了全切双眼皮开内眼角提肌后,竟然眼睛闭合不全了。睁眼状态下,自诉欧式大平行双眼皮,显宽深假上眼睑外翻,眼神显凶放松状态下睁眼仍然给人显怒瞪的感觉。闭眼不在老挝,1000块人民币能够享受什么优待?让老挝姑娘来告诉你当人们越来越有钱之后,首先会想到去哪里旅游观光呢?到底是体验欧洲的浪漫风情,还是体验日韩的繁华。(此处已添加小程序,请到今日头条客户端查看)可能都不太喜欢,因为他们想要找到一个物美小天才儿童平板不适合儿童?制造商删除应用程序小天才儿童平板电脑下架近日,有家长反映,专为儿童设计的平板电脑有很多不适合儿童使用的内容。随后,该品牌官网发布回应称,将立即下架申请处理问题。并强化审计机制。北京的一位家长张女士最苏有朋在披荆斩棘忆小虎队还记得12年前春晚的虎年之约吗?披荆斩棘第二季开播了,当王心凌的爱你还萦绕脑海时,包括苏有朋在内的一群老男孩,又给我们上演一出属于男生的回忆杀。最后一首歌,是苏有朋等哥哥们表演的爱和红蜻蜓。旋律一起,潘玮柏哭了,洋河酒厂副总周新虎年薪151万不如刘化霜所持股票市值4亿多很有钱运营商财经网张杨文洋河股份位于中国白酒之都江苏省宿迁市,坐拥三河两湖一湿地,是世界三大湿地名酒产区之一。该公司的董事副总裁总工程师周新虎,在公司任职多年,很多业内人士都对他的个人经第17届中国杜鹃花展作为中国十大名花之一的杜鹃花,被称为花中西施,具有端庄绮丽娇艳多姿雅俗共赏的特点,深受人们的喜爱。近几年,常州每年都举办杜鹃花展,而今年的杜鹃花展将升级为国字头的,因为第17届中国2022虎年男孩气韵天成,苍穹御风的男宝宝名字大全在给男孩子起名的时候需要仔细的思考,毕竟名字的选择很重要,如果不知道如何给孩子起名的话,可以根据古诗词来为宝宝起名也可以选择一些有意义或者是表示远大志向的汉字为宝宝取名。当您的男生2022虎年男孩清风穆然,慧日朗然的男宝宝名字大全一个吉利大气的名字,对孩子一生有很大的意义,也是父母送给孩子最好的礼物。名字也是他人认识孩子的最好方式,因此,每位父母都会非常认真的对待,好的名字将给孩子带来好运,提升孩子一般的生
东决抢七谁能赢?热火22天10战绿军23天12战两队体能消耗太大了北京时间5月30日,202122赛季NBA季后赛继续进行,热火坐镇主场迎战凯尔特人,双方将展开残酷的抢七大战。赛前,一组数据呈现在球迷们眼前,热火与凯尔特人这两支球队,在季后赛阶段欧冠输球都怪你!英媒列举卡里乌斯的6大女友,个个颜值身材出色北京时间5月28日,利物浦在欧冠输给皇家马德里队,5年内第二个俯首称臣,未能追平AC米兰的7冠。赛后,无处发泄怒火的英国媒体批评了巴黎的球场,同时列举出卡里乌斯的前女友。就好像利物抢七最后时刻连追11分,热火还是被淘汰!离夺冠到底差多少?5月30日,凯尔特人vs热火的抢七结束了,最后时刻热火连追11分,但还是输掉了比赛。最终热火大比分34,被淘汰了!今年的季后赛决赛圈的四支球队,有3支球队的球员分别入选联盟最佳阵容中超揭幕战门票价格100元,侮辱的是中国足球还是中国球迷6月3日,新赛季中超联赛揭幕战山东泰山与浙江队的揭幕战将在海口五源河体育中心进行,票务网站大麦网今天开售本场门票。大麦网的中超揭幕战门票价格为100元。未曾料想,中超联赛揭幕战10巴特勒空砍,热火输球罪人被揪出,攻防低迷,热火2700万打水漂5月30日,东部决赛抢七大战拉开大幕,在这场退无可退的比赛中,凯尔特人和热火队已经做好了殊死一搏的准备。赛前,凯尔特人这边迎来了利好,联盟安排的主裁判是福斯特,此前,福斯特曾经吹罚便士哈达威收到猛将!能摸到篮板上沿的前锋转学至NCAA孟菲斯大学北京时间5月30日,德州大学阿灵顿分校(UTArlington)前锋KaodirichiAkobunduEhiogu宣布转学至NCAA孟菲斯大学。KaodirichiAkobundNBA官方承认重大误判,东决120秒裁判6次犯错,热火胜之不武实锤北京时间5月19日,在今天早上7点,NBA官方发布了东部决赛第6场比赛的裁判报告,结果报告却承认有多达6次误判,也让人对NBA的判罚彻底无语。在这场大战当中,热火队最终在客场成功地女歌手卡米拉卡贝洛精彩献唱,迷倒欧冠万众球迷人物资料卡米拉卡贝洛,全名卡拉卡米拉卡贝洛埃斯特拉巴奥1997年出生于古巴哈瓦那,古巴裔美国流行乐女歌手词曲作者。5月28日,古巴裔美国流行乐女歌手卡米拉卡贝罗(CamilaCab彻底放飞了?内马尔在韩国夜店狂饮至凌晨5点半花1200万韩元买酒韩国队即将在6月2日坐镇主场与巴西队进行一场世界杯前的热身赛,内马尔等巴西球星已经抵达韩国,并开启了训练。据韩国媒体报道,本场比赛的门票在网上销售一空,当地球迷都非常期待内马尔和孙中超开赛再送惊喜礼包,陈戌源力推球迷沸腾,最快11轮恢复主客场北京时间的6月3号,中超联赛新赛季即将打响,对于三大赛区来说,将会承办前十轮的比赛,中超联赛也都是正式公布了前十轮的赛程。在近期召开的赛区媒体通气会当中,中超联赛的负责人也向媒体公在韩国当练习生有多苦?韩庚骨折不自知,金秦禹跳到脚丫子冒热气在韩国当练习生有多苦?韩庚骨折不自知,金秦禹跳到脚丫子冒热气。韩庚,当年每天练习10几个小时的舞,后来,骨折了,也没感觉到,去医院的时候,骨头都快愈合了,去韩国当练习生累,苦,鹿晗