[图解]企业应用架构模式2024新译本讲解20-数据映射器2

1
00:00:01,860 --> 00:00:06,180
那么这个数据映射器因为它有这样的特点

2
00:00:07,310 --> 00:00:12,630
你想想,它负责同步这两边

3
00:00:13,010 --> 00:00:14,930
对象、数据库是独立的

4
00:00:15,990 --> 00:00:18,690
然后

5
00:00:18,700 --> 00:00:20,610
数据库里面的数据拿出来

6
00:00:20,620 --> 00:00:22,360
变成内存里面的

7
00:00:22,370 --> 00:00:25,360
一个对象的映像

8
00:00:26,410 --> 00:00:28,650
然后内存里对象被修改了

9
00:00:28,940 --> 00:00:30,910
或者新增一条或者删除一个

10
00:00:31,540 --> 00:00:35,300
那么这种变化要同步到数据库里面去

11
00:00:36,860 --> 00:00:38,850
现在领域层你也不管

12
00:00:38,860 --> 00:00:40,780
数据库这边也不管

13
00:00:40,790 --> 00:00:42,530
所有的压力

14
00:00:42,540 --> 00:00:43,690
都是由这个框架

15
00:00:44,570 --> 00:00:47,450
由映射器本身来管的

16
00:00:49,640 --> 00:00:53,950
显然映射器肯定要比较复杂的

17
00:00:54,160 --> 00:00:56,930
因为所有的压力都在它那边

18
00:01:01,260 --> 00:01:02,330
既然复杂

19
00:01:02,340 --> 00:01:07,010
而且我们前面讲,它是可以独立的

20
00:01:07,260 --> 00:01:08,290
相对比较独立的

21
00:01:08,300 --> 00:01:09,530
可以随便更换的

22
00:01:12,520 --> 00:01:15,720
还有领域层根本就不知道它的存在

23
00:01:15,730 --> 00:01:16,000


24
00:01:16,010 --> 00:01:17,320
不需要知道它的存在

25
00:01:19,020 --> 00:01:21,050
显然用现成的这种

26
00:01:21,350 --> 00:01:24,390
已有的比较成熟的产品

27
00:01:24,520 --> 00:01:25,790
是更合适的

28
00:01:26,860 --> 00:01:28,010
不用自己来做

29
00:01:30,530 --> 00:01:31,560
比较有名的

30
00:01:31,570 --> 00:01:33,360
基于这种映射器的

31
00:01:33,690 --> 00:01:36,410
数据映射器的模式的产品

32
00:01:36,420 --> 00:01:38,130
比如说Hibernate

33
00:01:38,550 --> 00:01:41,150
还有MyBatis

34
00:01:42,900 --> 00:01:44,210
还有Entity Framework

35
00:01:44,340 --> 00:01:47,480
就是那个.net下面的

36
00:01:49,240 --> 00:01:50,960
当然还有更多

37
00:01:51,410 --> 00:01:55,550
但是我对这方面并不是很了解

38
00:01:55,880 --> 00:02:00,840
到底哪个在别的平台上更流行

39
00:02:01,010 --> 00:02:03,250
我用的最多的就是Entity Framework

40
00:02:03,260 --> 00:02:05,170
之前也用过NHibernate

41
00:02:07,450 --> 00:02:09,560
就是Hibernate的.net版本

42
00:02:12,690 --> 00:02:15,330
当然这个MyBatis好像也是有.net的

43
00:02:15,340 --> 00:02:17,570
但是没有用过

44
00:02:27,070 --> 00:02:27,900


45
00:02:29,670 --> 00:02:32,950
那么映射器这个模式

46
00:02:33,160 --> 00:02:34,430
数据映射器这个模式

47
00:02:34,440 --> 00:02:36,990
它是比较复杂的一个模式

48
00:02:40,060 --> 00:02:43,060
一会我们在演示案例代码的时候

49
00:02:44,340 --> 00:02:45,500
我们会发现它里面

50
00:02:45,510 --> 00:02:48,920
涉及到了很多相关的模式

51
00:02:50,300 --> 00:02:53,190
因为它要实现这样一个映射器

52
00:02:53,200 --> 00:02:54,950
也就是两边同步

53
00:02:54,960 --> 00:02:58,430
它就要考虑很多问题

54
00:02:59,200 --> 00:03:00,510
考虑的这些问题

55
00:03:01,300 --> 00:03:04,000
在书里面它就归纳成了一些模式

56
00:03:06,730 --> 00:03:10,090
包括但不限于,层超类型

57
00:03:10,450 --> 00:03:12,500
标识映射,分离接口、工作单元

58
00:03:12,510 --> 00:03:15,240
元数据映射、延迟加载等等

59
00:03:16,220 --> 00:03:20,370
一会我们在演示和解析案例代码的时候

60
00:03:21,060 --> 00:03:24,960
我们碰到相应的模式在应用的时候

61
00:03:25,460 --> 00:03:30,020
我们就会转到,顺便讲解一下这个模式

62
00:03:31,150 --> 00:03:32,630
当然,我也不会都讲解

63
00:03:32,640 --> 00:03:35,310
因为它涉及到很多的模式

64
00:03:35,840 --> 00:03:38,280
我们说代码里面碰到的,值得一讲的

65
00:03:38,450 --> 00:03:39,960
就会专门来讲

66
00:03:41,360 --> 00:03:43,990
也是书里面的,另外章节的模式了

67
00:03:47,570 --> 00:03:49,850
那么有一些可能代码没涉及

68
00:03:49,860 --> 00:03:53,120
或者觉得限于篇幅的考虑

69
00:03:53,130 --> 00:03:55,280
没有必要讲的,我们就跳过去

70
00:04:01,650 --> 00:04:03,430
接下来,我们来看案例

71
00:04:04,940 --> 00:04:07,980
案例还是跟前面的活动记录

72
00:04:08,290 --> 00:04:12,050
还有入口,行数据入口一样的

73
00:04:12,060 --> 00:04:15,790
都是一个人员的表而已

74
00:04:21,300 --> 00:04:25,030
这个案例项目也是用C#写的

75
00:04:25,040 --> 00:04:27,910
来源跟之前的来源是一样的

76
00:04:29,500 --> 00:04:32,380
就是书上的代码片段

77
00:04:33,030 --> 00:04:35,440
复刻出来的一个案例

78
00:04:38,630 --> 00:04:40,920
和之前的活动记录

79
00:04:40,930 --> 00:04:45,750
还有入口不一样的是,这里分了几个包

80
00:04:46,910 --> 00:04:49,070
分了几个包,有领域包

81
00:04:49,080 --> 00:04:50,150
映射器包

82
00:04:50,160 --> 00:04:51,230
数据库包

83
00:04:53,270 --> 00:04:55,100
不像以前一样都放一个包里面

84
00:04:55,110 --> 00:04:59,150
因为它要涉及到分离接口

85
00:05:00,470 --> 00:05:01,680
映射器本身

86
00:05:01,690 --> 00:05:05,590
还要有一个单独独立的包等等

87
00:05:06,190 --> 00:05:10,220
所以这里面就会分几个包

88
00:05:10,470 --> 00:05:17,060
我们这个类已经比较多了

89
00:05:17,270 --> 00:05:18,780
把它分到几个包里面去

90
00:05:22,370 --> 00:05:27,390
总的类有这么一些

91
00:05:27,770 --> 00:05:30,080
我们来看,你看,这个图

92
00:05:30,090 --> 00:05:33,150
应该还可以看得清楚

93
00:05:35,990 --> 00:05:37,680
这是映射器,具体映射器

94
00:05:37,770 --> 00:05:39,280
这有个抽象的映射器

95
00:05:42,750 --> 00:05:48,510
然后这里还实现了一个接口,查找器的接口

96
00:05:51,670 --> 00:05:55,600
也就是说

97
00:05:55,610 --> 00:05:58,920
它单独把查找的这些方法

98
00:05:58,930 --> 00:06:01,940
把它分离到这样一个

99
00:06:01,950 --> 00:06:05,290
查找器的里面去

100
00:06:05,460 --> 00:06:06,890
作为一个接口在这里

101
00:06:10,740 --> 00:06:13,970
这是我们一会会讲到的分离接口

102
00:06:21,200 --> 00:06:25,270
你看,这里,这是Person领域对象

103
00:06:25,280 --> 00:06:27,230
这是PersonMapper

104
00:06:27,860 --> 00:06:32,170
这是映射器,就是Person的实体类

105
00:06:33,180 --> 00:06:37,150
你看,它们都有一个共同的超类

106
00:06:37,810 --> 00:06:39,520
因为我们这里只有一个类

107
00:06:39,650 --> 00:06:41,200
但是如果说我们这里有很多

108
00:06:41,210 --> 00:06:42,080
有Person

109
00:06:42,740 --> 00:06:43,290
有Customer

110
00:06:44,300 --> 00:06:46,250
Order什么之类的

111
00:06:46,740 --> 00:06:48,950
这里同样也有一批

112
00:06:49,870 --> 00:06:52,380
那么这些共同的领域类也好

113
00:06:52,390 --> 00:06:54,780
它会有一个共同的超类

114
00:06:57,430 --> 00:06:58,340
超类的目的

115
00:06:59,880 --> 00:07:01,840
主要是维护一些共同的东西了

116
00:07:02,430 --> 00:07:04,860
这个就是我们一会要提到的

117
00:07:06,820 --> 00:07:08,380
Fowler把它归纳

118
00:07:08,390 --> 00:07:11,910
叫做层超类型这样一个模式

119
00:07:18,470 --> 00:07:19,540
这是它的类

120
00:07:21,070 --> 00:07:24,670
你看,Person这个类已经很简单

121
00:07:24,680 --> 00:07:24,950


122
00:07:24,960 --> 00:07:28,740
里面全部都是只有领域的操作

123
00:07:29,110 --> 00:07:31,620
因为数据的操作已经到这里来了

124
00:07:31,830 --> 00:07:32,980
到这里面来了

125
00:07:34,200 --> 00:07:35,660
查找更新什么的

126
00:07:37,940 --> 00:07:38,860
到这里来了

127
00:07:39,480 --> 00:07:44,690
而且有一些是在抽象类里面

128
00:07:48,410 --> 00:07:49,990
先在抽象类里面

129
00:07:50,000 --> 00:07:51,230
定义抽象的方法

130
00:07:51,240 --> 00:07:55,160
然后下面来实现,下面来覆盖实现

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值