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
然后下面来实现,下面来覆盖实现