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
然后复刻成了完整的代码