
 1
1
 00:00:00,150 --> 00:00:05,030
 接下来我们来看服务层模式
2
 00:00:06,070 --> 00:00:11,740
 这也是领域逻辑类型的最后一个模式
3
 00:00:13,700 --> 00:00:17,110
 我们前面实际上已经见过了,事务脚本
4
 00:00:17,240 --> 00:00:19,900
 的时候,已经见过了
5
 00:00:21,030 --> 00:00:22,960
 这里单独拿出来讲
6
 00:00:24,220 --> 00:00:26,490
 就是说,重点放在它上面
7
 00:00:30,680 --> 00:00:32,150
 这是书里面的定义
8
 00:00:32,920 --> 00:00:37,110
 通过一个层……
9
 00:00:37,570 --> 00:00:39,570
 实际上这个就类似于
10
 00:00:39,580 --> 00:00:42,050
 我们分析里面的控制类
11
 00:00:44,660 --> 00:00:47,190
 为什么需要这样一个层
12
 00:00:48,540 --> 00:00:49,210
 什么叫层
13
 00:00:49,220 --> 00:00:54,920
 我们前面也讲,类似性质的类的集合放一起
14
 00:00:55,730 --> 00:00:57,540
 因为它是一个不严谨的概念
15
 00:00:57,550 --> 00:00:59,660
 就是差不多的类的集合
16
 00:01:01,070 --> 00:01:03,530
 放一个包里面,类似这样
17
 00:01:06,610 --> 00:01:08,300
 为什么需要这样一个
18
 00:01:08,650 --> 00:01:12,960
 就是说,我们的核心域逻辑
19
 00:01:14,570 --> 00:01:16,120
 这是我的说法了
20
 00:01:16,130 --> 00:01:17,880
 书里面讲的不是这样讲
21
 00:01:17,890 --> 00:01:19,800
 说有领域逻辑、应用逻辑
22
 00:01:20,070 --> 00:01:22,000
 但实际上你说应用逻辑
23
 00:01:22,010 --> 00:01:24,530
 难道就不是领域逻辑的一部分吗
24
 00:01:24,540 --> 00:01:24,890
 是的
25
 00:01:25,660 --> 00:01:27,530
 我们应该说都是领域逻辑
26
 00:01:28,100 --> 00:01:29,660
 只不过有的是类级别的
27
 00:01:33,590 --> 00:01:34,820
 实体类级别的
28
 00:01:34,830 --> 00:01:39,430
 也就是说,它所有的逻辑
29
 00:01:39,440 --> 00:01:41,320
 能封装在类的操作里面
30
 00:01:42,540 --> 00:01:43,860
 包括状态机里面
31
 00:01:45,030 --> 00:01:47,390
 当然这个类,可能会组合其他类
32
 00:01:50,070 --> 00:01:52,430
 也就是说,责任分配给它
33
 00:01:52,440 --> 00:01:53,830
 它能够自己搞定
34
 00:01:55,640 --> 00:01:58,000
 从核心域的角度上面
35
 00:01:58,010 --> 00:02:01,270
 当然,后面还有数据库什么的再说了
36
 00:02:02,530 --> 00:02:08,400
 这个是类级别的逻辑
37
 00:02:09,530 --> 00:02:10,520
 大多数的逻辑
38
 00:02:10,530 --> 00:02:12,920
 都应该封装在类似这样的地方
39
 00:02:16,220 --> 00:02:17,380
 但是有一些逻辑
40
 00:02:17,390 --> 00:02:21,450
 它可能跟特定的用例相关的
41
 00:02:24,710 --> 00:02:34,540
 那么它需要调用很多个类来协作完成
42
 00:02:35,230 --> 00:02:38,270
 这种很可能不适合放在某一个类里面
43
 00:02:38,930 --> 00:02:41,290
 那就需要一个类似控制类这样的
44
 00:02:41,300 --> 00:02:43,210
 应用服务类
45
 00:02:44,250 --> 00:02:45,770
 来协调它们
46
 00:02:46,320 --> 00:02:48,730
 这种逻辑就是应用级别逻辑
47
 00:02:48,740 --> 00:02:52,770
 它是跟用例的控制流相关的
48
 00:02:54,610 --> 00:02:59,900
 所以命名往往是以用例的名字来命名
49
 00:03:01,420 --> 00:03:02,980
 或者用例集的名字来命名
50
 00:03:02,990 --> 00:03:05,080
 我们前面也讲过了
51
 00:03:07,470 --> 00:03:12,190
 那么它的存在只是为了协调这几个类
52
 00:03:12,320 --> 00:03:16,220
 也就是说,我们的类本身
53
 00:03:18,390 --> 00:03:23,340
 它本身如果没有用例的情况下
54
 00:03:24,070 --> 00:03:25,360
 很可能类本身
55
 00:03:25,370 --> 00:03:27,890
 可能是孤立的,独立的
56
 00:03:29,090 --> 00:03:30,640
 之间并没有静态关系
57
 00:03:32,110 --> 00:03:32,930
 它就摆在那里
58
 00:03:34,580 --> 00:03:36,810
 只有当你这个用例发生的时候
59
 00:03:37,070 --> 00:03:39,630
 通过应用服务或者控制类
60
 00:03:42,650 --> 00:03:43,840
 让它们一起来协作
61
 00:03:47,400 --> 00:03:48,120
 要是没发生
62
 00:03:48,130 --> 00:03:50,600
 那么它们可能互相并不知道对方
63
 00:03:51,860 --> 00:03:53,010
 如果它们知道对方
64
 00:03:53,020 --> 00:03:55,050
 很可能它们自己就可以协作了
65
 00:03:55,420 --> 00:03:57,720
 比如说,订单,订单项,商品
66
 00:03:57,730 --> 00:04:00,750
 它们之间有静态关系的
67
 00:04:01,220 --> 00:04:03,380
 那时候很可能你发一个消息给订单
68
 00:04:03,840 --> 00:04:05,440
 订单会自己找订单项
69
 00:04:05,450 --> 00:04:06,520
 订单项找商品
70
 00:04:07,100 --> 00:04:08,170
 这事情就做完了
71
 00:04:08,420 --> 00:04:10,710
 并不需要外面一个类找订单
72
 00:04:10,720 --> 00:04:13,470
 然后外面一个类再找订单项
73
 00:04:13,880 --> 00:04:15,460
 外面一个类再找商品
74
 00:04:15,470 --> 00:04:21,950
 不需要,应用级别的
75
 00:04:22,680 --> 00:04:23,870
 有了这样一个类之后
76
 00:04:24,650 --> 00:04:29,720
 它就使得这个逻辑
77
 00:04:30,210 --> 00:04:32,860
 就不会放到某个特定的类里面
78
 00:04:33,880 --> 00:04:35,170
 而是单独独立出来
79
 00:04:36,680 --> 00:04:40,710
 原来那些类,它就有了更多复用的可能
80
 00:04:41,290 --> 00:04:43,020
 如果说你某个用例
81
 00:04:43,030 --> 00:04:45,340
 特有的流程的信息
82
 00:04:45,350 --> 00:04:46,660
 就放在某个类里面
83
 00:04:49,290 --> 00:04:51,810
 那很可能另外一个用例用的时候
84
 00:04:52,340 --> 00:04:53,410
 它就会受到影响了
85
 00:04:53,420 --> 00:04:54,850
 很可能很多是不适合的
86
 00:04:54,860 --> 00:04:57,290
 那么复用的可能性就降低了
87
 00:04:58,960 --> 00:05:00,680
 当然,如果说,我们前面讲
88
 00:05:00,690 --> 00:05:02,040
 如果能够把它变成
89
 00:05:03,240 --> 00:05:06,870
 确实是某个实体类能够搞定的
90
 00:05:09,530 --> 00:05:12,990
 那么优先还是放在实体类里面了
91
 00:05:14,770 --> 00:05:18,080
 但是要注意实体类的这种划分
92
 00:05:18,850 --> 00:05:20,170
 识别、构造等等
93
 00:05:20,180 --> 00:05:23,500
 要按照我们特定的规则来完成
94
 00:05:24,500 --> 00:05:27,990
 不能说我为了尽可能放在实体类里面
95
 00:05:28,000 --> 00:05:30,690
 我搞一个特别大的实体类
96
 00:05:31,790 --> 00:05:33,540
 我在实体类里面有100个属性
97
 00:05:35,620 --> 00:05:38,140
 所以我就取消了前面的服务类
98
 00:05:38,150 --> 00:05:40,710
 你看,我就一个实体类
99
 00:05:41,170 --> 00:05:42,400
 这实体类就叫系统
100
 00:05:43,900 --> 00:05:46,190
 这个系统有100个属性
101
 00:05:48,380 --> 00:05:49,820
 那是没用的
102
 00:05:50,030 --> 00:05:52,560
 首先你这个类本身
103
 00:05:52,570 --> 00:05:54,720
 它要按照我们的一定的
104
 00:05:54,730 --> 00:05:56,320
 这种规则来建立
105
 00:05:56,870 --> 00:05:59,860
 还是我们前面讲的,没有冗余的规则
106
 00:06:00,480 --> 00:06:02,310
 包括前面的课程也说过了
107
 00:06:03,170 --> 00:06:04,570
 把各种各样信息
108
 00:06:04,580 --> 00:06:06,770
 按照没有冗余这种方式
109
 00:06:07,970 --> 00:06:09,160
 识别和建模
110
 00:06:10,750 --> 00:06:13,540
 然后需要各种形式的信息的时候
111
 00:06:13,550 --> 00:06:17,170
 通过集合运算计算出来
112
 00:06:17,820 --> 00:06:19,060
 而不是搞一个很大的
113
 00:06:19,470 --> 00:06:21,950
 里面有很多冗余
114
 00:06:24,040 --> 00:06:28,800
 那么这又是另外一种遮羞布
115
 00:06:29,090 --> 00:06:31,990
 他说,你看,我没有用服务类
116
 00:06:32,780 --> 00:06:35,110
 我就放实体类里面,实体类很大
117
 00:06:35,120 --> 00:06:35,870
 不对
118
 00:06:38,410 --> 00:06:44,090
 好,这是我们说的服务层里面的道理













![[2024-06]-[大模型]-[Ollama]- WebUI](https://img-blog.csdnimg.cn/direct/15d9c2968c26446aa797d52ae1e4a66d.png)





