[图解]企业应用架构模式2024新译本讲解15-行数据入口

1
00:00:01,060 --> 00:00:02,770
数据算完了

2
00:00:03,070 --> 00:00:07,720
接下来就是我们这一节的主要内容了

3
00:00:08,500 --> 00:00:13,630
应用服务调用第三方的,Email

4
00:00:13,640 --> 00:00:18,280
包括集成应用的接口来发Email

5
00:00:18,290 --> 00:00:20,080
或者发布到集成应用上面

6
00:00:20,090 --> 00:00:26,300
我们来看

7
00:00:26,530 --> 00:00:30,430
它首先获取一个

8
00:00:31,000 --> 00:00:31,950
Email的入口

9
00:00:32,590 --> 00:00:36,170
然后调用它的发Email的操作

10
00:00:37,250 --> 00:00:41,360
我们来看第一个,获取入口

11
00:00:42,770 --> 00:00:44,390
是应用服务这里定义的

12
00:00:45,030 --> 00:00:46,160
你看它的返回类型

13
00:00:46,430 --> 00:00:48,500
注意这里是一个接口类型

14
00:00:49,510 --> 00:00:53,510
这里,也就是说

15
00:00:54,170 --> 00:00:58,060
它只是依赖于接口类型的对象

16
00:00:58,920 --> 00:01:02,720
至于你具体的下面是哪个具体类型来实现

17
00:01:03,930 --> 00:01:05,520
你可以灵活变化

18
00:01:06,980 --> 00:01:12,240
所以这个里面的话就留下了变化的空间

19
00:01:13,990 --> 00:01:14,870
我们前面讲了

20
00:01:14,880 --> 00:01:17,310
通过泛化来达到这点变化

21
00:01:17,320 --> 00:01:20,100
就是绝大多数面向对象

22
00:01:21,040 --> 00:01:22,840
这些什么技巧

23
00:01:22,850 --> 00:01:24,040
说来说去就这样一个

24
00:01:24,480 --> 00:01:25,780
前面已经说过好几遍了

25
00:01:27,000 --> 00:01:27,760
返回

26
00:01:30,400 --> 00:01:32,220
好,有了这个

27
00:01:32,580 --> 00:01:36,330
然后就调用它发送Email的操作

28
00:01:36,460 --> 00:01:37,490
我们看参数

29
00:01:39,020 --> 00:01:42,800
参数有一个两个三个,代表了什么

30
00:01:43,370 --> 00:01:46,330
Email的地址

31
00:01:46,720 --> 00:01:49,120
Email的主题

32
00:01:49,530 --> 00:01:53,690
这个是Email的内容

33
00:01:55,150 --> 00:01:58,040
在这里,你看地址,主题,内容

34
00:02:00,010 --> 00:02:01,640
这几个从哪里来的

35
00:02:01,650 --> 00:02:09,340
就是从合同这个表

36
00:02:10,230 --> 00:02:12,100
数据表

37
00:02:12,110 --> 00:02:13,670
返回数据表的第一行

38
00:02:15,020 --> 00:02:16,460
各个字段里面来的

39
00:02:17,370 --> 00:02:21,660
这里面来的

40
00:02:22,890 --> 00:02:25,270
当然这里只是模拟发Email了

41
00:02:25,280 --> 00:02:26,670
把它写到控制台

42
00:02:26,760 --> 00:02:28,030
没有说真正发Email

43
00:02:30,700 --> 00:02:31,900
好,Email发出去了

44
00:02:32,150 --> 00:02:33,300
同样第二个一样

45
00:02:33,310 --> 00:02:36,780
获取入口,调用,一样的

46
00:02:38,070 --> 00:02:40,460
也是同样的,返回是接口类型

47
00:02:42,980 --> 00:02:47,890
发布这里有点区别

48
00:02:47,900 --> 00:02:52,610
你看这里,它参数放了一行进来

49
00:02:53,420 --> 00:02:59,610
放了一个数据行作为参数

50
00:03:01,190 --> 00:03:03,480
表示可以有不同的做法

51
00:03:05,330 --> 00:03:07,490
然后就把这一行作为参数放进来

52
00:03:07,500 --> 00:03:09,940
然后取里面字段

53
00:03:09,950 --> 00:03:10,980
ID、字段

54
00:03:11,720 --> 00:03:13,760


55
00:03:14,770 --> 00:03:15,640
两个字段

56
00:03:21,100 --> 00:03:21,810
这样来

57
00:03:23,550 --> 00:03:24,540
好,这是计算

58
00:03:25,380 --> 00:03:27,290
所以,这里面

59
00:03:27,660 --> 00:03:29,410
他在计算操作里面

60
00:03:29,420 --> 00:03:31,200
加了两个内容

61
00:03:31,510 --> 00:03:32,700
一个是发Email

62
00:03:33,030 --> 00:03:38,100
一个是发布到第三方的应用

63
00:03:40,060 --> 00:03:40,970
后面都一样了

64
00:03:40,980 --> 00:03:43,490
后面查询我们前面已经见过了

65
00:03:44,120 --> 00:03:47,290
就不多说了,一样的

66
00:03:47,300 --> 00:03:51,650
你看,这里面,一一模一样

67
00:03:52,740 --> 00:03:56,620
我们就

68
00:03:57,010 --> 00:03:59,950
你看这里,查出来,累计

69
00:04:00,410 --> 00:04:00,960
一样的

70
00:04:02,920 --> 00:04:10,450
好,我们直接继续了

71
00:04:10,860 --> 00:04:13,490
继续之后,你看我们这里

72
00:04:13,980 --> 00:04:19,500
发Email的内容,这是查询内容

73
00:04:20,940 --> 00:04:22,220
发布内容

74
00:04:22,230 --> 00:04:25,470
查询内容

75
00:04:32,230 --> 00:04:34,380


76
00:04:35,040 --> 00:04:38,840
发Email,发布,查询结果

77
00:04:39,510 --> 00:04:41,020


78
00:04:41,110 --> 00:04:42,580


79
00:04:43,300 --> 00:04:43,730
这样来

1
00:00:00,440 --> 00:00:04,640
下一个模式,我们要说的是行数据入口

2
00:00:05,500 --> 00:00:08,160
前面那个领域模式

3
00:00:08,520 --> 00:00:10,720
领域层的模式已经说完了

4
00:00:11,440 --> 00:00:13,750
接下来是数据源架构模式

5
00:00:13,760 --> 00:00:15,190
我们挑一些来讲

6
00:00:17,890 --> 00:00:20,800
前面我们讲事务脚本的时候说过

7
00:00:21,170 --> 00:00:22,480
表数据入口

1
00:00:01,720 --> 00:00:02,920
表数据入口

2
00:00:02,930 --> 00:00:05,520
是一个对象

3
00:00:05,530 --> 00:00:08,170
就搞定一个表里面所有行

4
00:00:10,430 --> 00:00:11,430
而行数据入口

5
00:00:11,440 --> 00:00:14,010
就是每个对象

6
00:00:14,020 --> 00:00:16,220
就模拟数据库里面

7
00:00:16,230 --> 00:00:20,260
某个表里面的一行

8
00:00:20,270 --> 00:00:23,450
也就是说,一行一个对象

9
00:00:24,190 --> 00:00:29,700
显然,你有多少行,我们要访问

10
00:00:30,950 --> 00:00:33,320
我们就要多少个对象

11
00:00:34,030 --> 00:00:36,890
相当于在内存里面

12
00:00:36,900 --> 00:00:37,930
提供一个

13
00:00:38,990 --> 00:00:41,230
数据库里面行的一个模拟

14
00:00:42,130 --> 00:00:46,010
也就是说,它的结构

15
00:00:47,650 --> 00:00:50,880
跟数据库里面

16
00:00:51,650 --> 00:00:53,560
一行里面的结构是一样的

17
00:00:56,630 --> 00:00:59,140
它的目的主要是,跟前面的入口一样

18
00:00:59,230 --> 00:01:03,550
入口的目的,就是说,负责转换

19
00:01:04,480 --> 00:01:10,140
把前面的请求转成相应的数据的请求

20
00:01:13,120 --> 00:01:19,350
然后通过它来屏蔽数据源的访问细节

21
00:01:21,650 --> 00:01:25,840
特别是如果你有不同的数据源的时候

22
00:01:26,700 --> 00:01:28,470
或者数据源会变化的时候

23
00:01:30,920 --> 00:01:38,860
这个里面只会有插入、更新

24
00:01:38,870 --> 00:01:40,220
删除这样的逻辑

25
00:01:41,900 --> 00:01:44,320
它不能有领域逻辑

26
00:01:45,180 --> 00:01:46,030
如果有领域逻辑

27
00:01:46,040 --> 00:01:49,630
那就变成下我们下面要讲的另外一个模式

28
00:01:49,800 --> 00:01:51,710
就是活动记录那个模式了

29
00:01:52,920 --> 00:01:56,480
把领域逻辑跟数据访问逻辑

30
00:01:56,490 --> 00:02:00,000
混在同一个类里面

31
00:02:00,910 --> 00:02:05,370
相当于把入口,行入口

32
00:02:05,380 --> 00:02:09,360
这个类,Person入口这个类和

33
00:02:09,910 --> 00:02:13,480
Person类两个绑在一起

34
00:02:13,570 --> 00:02:14,920
两个都累加在一起

35
00:02:15,010 --> 00:02:16,520
变成一个活动记录

36
00:02:18,620 --> 00:02:22,570
那是后面的我们还会讲的

37
00:02:27,150 --> 00:02:31,990
所以,你要它是一行一个对象

38
00:02:32,120 --> 00:02:36,480
所以你要把它申请的对象

39
00:02:36,490 --> 00:02:39,950
它就配这样一个,单独给它配

40
00:02:40,160 --> 00:02:43,360
每一个单独,每个类或每个表

41
00:02:43,490 --> 00:02:46,200
单独配一个查找器

42
00:02:48,990 --> 00:02:57,090
然后把入口的对象给生成,加载数据

43
00:02:57,100 --> 00:02:59,090
然后生成入口的对象

44
00:03:05,800 --> 00:03:09,940
如果有这种元数据映射的代码生成

45
00:03:10,610 --> 00:03:12,020
那么这个入口本身

46
00:03:12,960 --> 00:03:17,230
它可以大批量

47
00:03:17,240 --> 00:03:18,310
通过自动化

48
00:03:18,320 --> 00:03:19,670
映射来生成

49
00:03:20,310 --> 00:03:22,840
不需要我们一个个这样一遍遍写

50
00:03:25,100 --> 00:03:28,530
我们后面讲到元数据映射模式的时候

51
00:03:29,050 --> 00:03:29,850
再说这个问题

52
00:03:32,600 --> 00:03:34,060
显然,这个也是配合

53
00:03:35,160 --> 00:03:36,800
面向过程的事务脚本

54
00:03:36,930 --> 00:03:39,120
跟前面的表数据入口一样

55
00:03:40,090 --> 00:03:47,800
如果是领域模型

56
00:03:47,810 --> 00:03:51,660
面向对象,配合就是映射器模式了

57
00:03:57,380 --> 00:03:58,330
我们来看案例

58
00:03:59,560 --> 00:04:04,170
这个案例跟之前的案例就不一样了

59
00:04:04,180 --> 00:04:06,130
它是换了一个

60
00:04:06,140 --> 00:04:09,060
书上就换了一个人员管理的案例

61
00:04:09,150 --> 00:04:10,900
就一个很简单的表

62
00:04:10,910 --> 00:04:12,140
人员表

63
00:04:14,460 --> 00:04:22,470
然后主键,ID、姓、名

64
00:04:22,560 --> 00:04:26,860
然后这个是他的家属

65
00:04:27,400 --> 00:04:28,510
家属的数量

66
00:04:30,580 --> 00:04:32,460
依赖于他的那些人的数量

67
00:04:32,670 --> 00:04:40,070
所以后面会有一个说谁是负责人

68
00:04:41,640 --> 00:04:43,270
有多少人靠着你吃饭

69
00:04:43,280 --> 00:04:47,640
你就是那个家的主人

70
00:04:48,250 --> 00:04:50,720
主人或者负责人

71
00:04:52,220 --> 00:04:53,410
有多少人依赖你

72
00:04:53,420 --> 00:04:55,290
家属和下属都可以

73
00:05:02,540 --> 00:05:05,440
同样的,这个案例来源

74
00:05:05,450 --> 00:05:08,150
我们也是用网络上

75
00:05:08,160 --> 00:05:14,350
有一家用C#复刻的案例一样的

76
00:05:16,480 --> 00:05:21,630
类图,入口类

77
00:05:22,190 --> 00:05:30,470
它继承了一个基入口

78
00:05:30,810 --> 00:05:32,490
但一会我们看代码会看到

79
00:05:32,500 --> 00:05:34,910
它里面也没干什么

80
00:05:35,360 --> 00:05:38,790
就是有一个ID是在这里面定义的

81
00:05:39,310 --> 00:05:42,000
就是说,由超类来控制ID

82
00:05:42,640 --> 00:05:45,190
所有的子类不管你什么ID

83
00:05:45,860 --> 00:05:49,230
就是说,都是用超类那里的ID

84
00:05:53,080 --> 00:05:57,460
然后下面,它这里用一个注册表

85
00:05:58,280 --> 00:06:02,590
来存放PersonsMap

86
00:06:03,040 --> 00:06:08,790
里面有一个集合,里面有个词典

87
00:06:08,800 --> 00:06:14,140
里面有很多人员入口的对象

88
00:06:16,100 --> 00:06:17,910
然后查找器

89
00:06:18,000 --> 00:06:20,470
查找器这里来查找

90
00:06:20,480 --> 00:06:22,820
给它ID

91
00:06:22,830 --> 00:06:27,610
然后返回一个人员入口的对象

92
00:06:28,930 --> 00:06:35,240
也可以查找哪些是负责人

93
00:06:35,960 --> 00:06:38,250
多了一个这个

94
00:06:38,260 --> 00:06:41,650
这都是书上给出了代码的片段

95
00:06:41,820 --> 00:06:47,520
然后复刻成了完整的代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/729328.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Springboot获取resources中的文件

1.Springboot以文件的形式获取resources中的文件 import com.google.gson.JsonIOException; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.JsonSyntaxException; import org.springframework.util.ResourceUtils; import j…

【Linux】进程信号2——阻塞信号,捕捉信号

1.阻塞信号 1.1. 信号其他相关常见概念 在开始内容之前,先介绍一些信号的专业名词: 实际执行信号的处理动作称为信号递达(Delivery)信号从产生到递达之间的状态,称为信号未决(Pending)&#…

Swift Combine — zip和combineLatest的理解与使用

Publisher 上还有一些其他的操作,比如 zip 和 combineLatest,能让我们在时序上对控制多个 Publisher 的结果进行类似 and 和 or 的合并,它们在构建复杂 Publisher 逻辑时也十分有用。 zip Publisher 中的 zip 和 Sequence 的 zip 相类似&am…

【备考指南】CDA Level Ⅰ 最全备考攻略

很多考生朋友在报名前后,一直不知道需要怎么备考,这里给大家盘点一下最全的备考攻略,希望对你有用: 1、需要准备好之后再报名吗? 不需要,CDA认证考试是报名后自行预约考试的,您可以先报名同时…

qml:一个基础的界面设计

文章目录 文章说明效果图重要代码说明组件矩形卡片窗口最大化后组件全部居中菜单栏Repeater实现重复8行图片加载直接加载图片文本转图片FluentUI中可供选择的图标 文章说明 qt6.5.3 qml写的一个界面配置设计软件,目前不含任何c代码,纯qml。windoms风格的…

WebStorm 配置 PlantUML

1. 安装 PlantUML 插件 在 WebStorm 插件市场搜索 PlantUML Integration 并安装,重启 WebStorm 使插件生效。 2. 安装 Graphviz PlantUML 需要 Graphviz 来生成图形。使用 Homebrew 安装 Graphviz: 打开终端(Terminal)。确保你…

mac 常用工具命令集合

Iterm2 Command T:新建标签 Command W:关闭当前标签 Command ← →:在标签之间切换 Control U:清除当前行 Control A:跳转到行首 Control E:跳转到行尾 Command F:查找 Command …

数据结构5---矩阵和广义表

一、矩阵的压缩存储 特殊矩阵:矩阵中很多值相同的元素并且它们的分布有一定的规律。 稀疏矩阵:矩阵中有很多零元素。压缩存储的基本思想是: (1)为多个值相同的元素只分配一个存储空间; (2)对零元素不分配存储空间。 1、特殊矩阵的压缩存储 (1)对称矩…

云渲染可以渲染SketchUp吗?

最近有很多人在问,云渲染可以渲染sketchup吗?答案是可以的,不过只有两三家支持,大部分云渲染是还是不支持的,今天就给大家介绍国内最新支持sketchup渲染的云渲染——炫云云渲染的使用方法。 炫云云渲染目前支持sketchu…

C++开发基础之频繁使用`std::endl`可能导致性能问题

前言 你是否曾经注意过这个问题,频繁使用std::endl可能导致性能问题。在C开发中,许多开发者习惯于使用std::endl来换行输出并刷新缓冲区。然而,这种习惯性操作可能会在高频率输出场景中带来显著的性能瓶颈。接下来,我们将深入探讨…

多模态大模型时代下的文档图像智能分析与处理

0. 前言 随着人工智能技术的不断发展,尤其是深度学习技术的广泛应用,多模态数据处理和大模型训练已成为当下研究的热点之一,这些技术也为文档图像智能处理和分析领域带来了新的发展机遇。 多模态大模型时代下的文档图像智能分析与处理的研究…

怎么使用Consul当配置中心和动态刷新配置

一、背景 由于Eureka官方已经正式宣布,自2.0起不再维护该项目,如果需要使用2.x,自行承担风险。 项目之前使用的Eureka,现在不维护了则需要寻找替代方案。现在Spring Cloud官方推荐Spring Cloud Consul替换Eureka作为注册中心&…

网络协议安全:TCP/IP协议栈的安全问题和解决方案

「作者简介」:北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖Web安全、系统安全等12个知识域的一百多个知识点,持续更新。 这一章节我们需要知道TCP/IP每…

openresty(Nginx) 301重定向域名 http访问强制使用https

1 访问http 2 修改配置访问 server {listen 80;server_name example.cn;return 301 https://$server_name$request_uri;access_log /data/logs/czgzzfjgsup_access.log access;error_log /data/logs/czgzzfjg_error.log error;#location / {root /usr/local/open…

领域驱动设计(DDD)微服务架构模式总结

part1. Domain Driven Design(Strategic Design,Tactical Design) Top Down focus on business or activityy domain Ubiquitous Language:统一语言 Tactical Design Tools:战术性设计工具 Implementing Domain Driven Design(Event storming,DDD in code) DDD总结…

大模型基础——从零实现一个Transformer(4)

大模型基础——从零实现一个Transformer(1)-CSDN博客 大模型基础——从零实现一个Transformer(2)-CSDN博客 大模型基础——从零实现一个Transformer(3)-CSDN博客 一、前言 上一篇文章已经把Encoder模块的单个EncodeBlock已经实现了 本文我们继续了解Transformer中剩下的其他…

Flutter【组件】富文本组件

简介 flutter 富文本组件。 github地址: https://github.com/ThinkerJack/jac_uikit 使用方式 运行 flutter pub add jac_uikit组件文档 使用方式: HighlightedTextWidget.builder(text: "全部文案包含高亮文案测试用",highlights: [Hig…

1. zookeeper分布式协调者

zookeeper分布协调者 一、zookeeper介绍1、软件设计架构1.1 单体架构1.2 SOA架构/分布式1.3 微服务架构 二、zookeeper角色1、角色2、选举机制3、znode类型 三、zookeeper集群部署1、环境规划2、安装jdk3、安装配置zookeeper3.1 安装zookeeper3.2 编辑配置文件3.3 创建myid文件…

聊聊最近比较火的AI产品做互联网算法备案

今年AI🔥了,而且是大火,导致监管部门相继出台相关政策,需要管控下,所以互联网算法备案就自然而然重新被提出来。其实这个互联网算法备案去年就已经开始实施了,去年只有几个大厂比如BAT等互联网巨头等会去弄…

Lazada API接口——一键获取商品买家评论数据信息

一、引言 在电商领域,买家评论是商品销售中不可忽视的重要因素。它们不仅影响着潜在消费者的购买决策,还为商家提供了宝贵的客户反馈。为了满足商家和数据分析师对买家评论数据的需求,我们特别开发了一款针对Lazada平台的接口,其…