第1部分 基础 2
第1章 今天的架构师和架构 2
1.1 软件架构到底是什么 2
1.1.1 把架构原则应用到软件中 3
1.1.2 确认需求 5
1.1.3 什么是架构,什么不是 8
1.1.4 架构流程 10
1.2 谁是架构师 12
1.2.1 架构师的职责 12
1.2.2 架构师的角色 14
1.2.3 关于架构师的常见误解 15
1.3 总结 17
1.4 笑到最后 17
第2章 为成功而设计 18
2.1 “大泥球” 18
2.1.1 “大泥球”的成因 19
2.1.2 “大泥球”的征兆 21
2.1.3 使用指标检测BBM 23
2.2 软件项目的机制 24
2.2.1 组织文化 24
2.2.2 帮助团队更好地写代码 26
2.3 走出混乱 29
2.3.1 有一种奇怪的东西叫作“遗留代码” 30
2.3.2 在3招之内将杀(checkmate) 30
2.3.3 决定是否添加人手 33
2.4 总结 34
2.5 笑到最后 35
第3章 软件设计的原则 36
3.1 软件设计的通用原则 36
3.1.1 从意大利面代码到千层饼代码 37
3.1.2 关注点分离 38
3.1.3 隔离 39
3.2 面向对象设计 39
3.2.1 相关类 40
3.2.2 对接口编程 40
3.2.3 组合与继承 42
3.2.4 反思面向对象 43
3.3 开发和设计向量 44
3.3.1 SOLID原则 44
3.3.2 处理依赖的模式 48
3.3.3 编码向量 50
3.3.4 使用模式 52
3.4 防御性编程 54
3.4.1 “如果—那么—抛出”模式 55
3.4.2 软件契约 55
3.5 总结 59
3.6 笑到最后 59
第4章 编写优质软件 60
4.1 编写可测试代码的艺术 60
4.1.1 什么是可测试性 61
4.1.2 测试你的软件 62
4.1.3 软件测试的常见实践 69
4.2 代码可扩展性的实践 73
4.2.1 基于接口的设计 74
4.2.2 插件架构 74
4.2.3 状态机 74
4.3 写出别人看得懂的代码 74
4.3.1 把可读性看作软件特性 75
4.3.2 一些改善可读性的实用规则 77
4.4 总结 79
4.5 笑到最后 79
第2部分 设计架构 82
第5章 发现领域架构 82
5.1 领域驱动设计的真正附加价值 82
5.1.1 DDD里有什么为我所用 83
5.1.2 使用DDD开展分析 83
5.1.3 策略模型设计 84
5.2 统一语言 85
5.2.1 统一语言的目的 85
5.2.2 统一语言的结构 86
5.2.3 如何定义统一语言 86
5.2.4 保持语言与模型同步 87
5.3 绑定上下文 88
5.3.1 发现上下文 88
5.3.2 把领域分割成绑定上下文 89
5.3.3 上下文映射 91
5.3.4 给予每个上下文它自己的架构 92
5.4 分层架构 94
5.4.1 分层架构的起源 94
5.4.2 表现层 96
5.4.3 应用程序层 96
5.4.4 领域层 98
5.4.5 基础设施层 98
5.5 总结 98
5.6 笑到最后 99
第6章 表现层 100
6.1 用户体验优先 100
6.1.1 关注交互 101
6.1.2 用户体验不是用户界面 102
6.1.3 如何创建有效的体验 104
6.2 真实场景 107
6.2.1 ASPNET网站 107
6.2.2 Web Foms与AS P.NET MVC 111
6.2.3 给网站添加设备支持 113
6.2.4 单页应用程序 117
6.2.5 桌面富客户端 120
6.3 总结 122
6.4 笑到最后 122
第7章 神秘的业务层 123
7.1 用来组织业务逻辑的模式 123
7.1.1 CRUD童话与架构白马王子 124
7.1.2 事务脚本模式 124
7.1.3 领域模型模式 127
7.1.4 贫血领域模型(反)模式 128
7.2 把焦点从数据移到任务 129
7.2.1 ASP.NET MVC里的任务编排 130
7.2.2 在领域里编排任务 133
7.3 跨越边界传输数据 134
7.3.1 分层架构里的数据流 134
7.3.2 共享领域模型实体 135
7.3.3 使用数据传输对象 136
7.4 总结 138
7.5 笑到最后 138
第3部分 支撑架构 140
第8章 领域模型导论 140
8.1 从数据到行为的转变 140
8.1.1 模型和领域背后的基本原理 140
8.1.2 数据库是基础设施 142
8.2 领域层的内部 143
8.2.1 领域模型 143
8.2.2 聚合 145
8.2.3 领域服务 150
8.2.4 领域事件 152
8.2.5 横切关注点 155
8.3 总结 157
8.4 笑到最后 157
第9章 实现领域模型 158
9.1 在线商店示例项目 158
9.1.1 入选的用例 158
9.1.2 入选的方案 159
9.1.3 “买买买”项目的结构 160
9.1.4 入选的技术 161
9.1.5 在线商店的绑定上下文 162
9.1.6 “买买买”应用程序的上下文映射 163
9.2 领域建模实用指南 164
9.2.1 行为是游戏规则的变革者 164
9.2.2 实体的基架 166
9.2.3 值对象的基架 169
9.2.4 标识聚合 172
9.2.5 持久化模型 179
9.3 实现业务逻辑 182
9.3.1 查找订单 183
9.3.2 下订单 183
9.3.3 忠诚卡(或客户忠诚计划) 187
9.4 总结 187
9.5 笑到最后 187
第10章 CQRS导论 188
10.1 分离命令与查询 188
10.1.1 CQRS模式概论 189
10.1.2 CQRS的好处 190
10.1.3 在业务层里使用CQRS 191
10.1.4 CQRS总能胜任架构需要 193
10.2 查询栈 194
10.2.1 读取领域模型 194
10.2.2 设计只读模型外观 196
10.2.3 分层表达式树 198
10.3 命令栈 202
10.3.1 回到表现层 203
10.3.2 规范化命令和事件 205
10.3.3 处理命令和事件 207
10.3.4 现成的存储 212
10.4 总结 214
10.5 笑到最后 214
第11章 实现CQRS 215
11.1 CQRS的实现 215
11.1.1 普通简单的CQRS 215
11.1.2 具有命令架构的CQRS 217
11.2 实现查询栈 219
11.2.1 创建读取外观 219
11.2.2 为调用方打包数据 220
11.3 实现命令栈 224
11.3.1 奠定基础 224
11.3.2 通过命令编排用例 227
11.4 总结 230
11.5 笑到最后 230
第12章 事件溯源导论 231
12.1 事件的突破 231
12.1.1 下一件大事(重装上阵) 231
12.1.2 现实世界不仅有模型,还有事件 232
12.1.3 抛弃“最近已知的正常状态” 232
12.1.4 事件对软件架构的深刻影响 234
12.2 事件源架构 236
12.2.1 持久化事件 236
12.2.2 回放事件 238
12.3 总结 240
12.4 笑到最后 240
第13章 实现事件溯源 241
13.1 事件溯源:为何以及何时 241
13.1.1 为什么说事件溯源是一个资源 242
13.1.2 事件溯源何时合适 243
13.2 带有回放的事件溯源 244
13.2.1 现场比分系统 244
13.2.2 系统的实现 246
13.3 带有聚合快照的事件溯源 255
13.3.1 迷你企业资源规划系统 256
13.3.2 系统的实现 257
13.4 总结 261
13.5 笑到最后 261
第4部分 基础设施 264
第14章 持久层 264
14.1 持久层概览 264
14.1.1 持久层的职责 264
14.1.2 仓储模式的设计 265
14.2 实现仓储 268
14.2.1 仓储的查询部分 268
14.2.2 持久化聚合 271
14.2.3 存储技术 272
14.3 为何你该考虑非关系型存储 275
14.3.1 熟悉NoSQL 276
14.3.2 你会得到什么,又会失去什么 277
14.3.3 做出一个正确的选择 280
14.4 总结 282
14.5 笑到最后 282