《Web开发者晋级之道:架构、模式和领域驱动设计》系统介绍软件的设计思想、架构和开发模式,带领读者快速建立软件开发的知识体系,另外还详细介绍基于ASP.NET Core的项目案例开发,帮助读者全面掌握如何快速开发高效、稳定的Web应用程序。
《Web开发者晋级之道:架构、模式和领域驱动设计》共10章,分为2篇。第1篇软件开发内功心法,首先介绍软件设计思想、软件架构、面向对象编程的六大原则和设计模式等知识,为软件开发初学者晋级打好基础,然后简要介绍一个电商项目的概况和架构设计,为后续的项目开发实践做好铺垫。第2篇领域驱动设计落地,首先介绍领域驱动设计的思想与方法,然后通过一个电商项目案例的开发实践,展现以领域模型为核心的Web应用程序的完整开发过程,包括基础设施层的实现、应用程序层的实现和展示层的实现等,后对MVC架构做详细介绍,这些内容展现了高品质软件开发的核心价值和面向对象程序设计的思想价值。
《Web开发者晋级之道:架构、模式和领域驱动设计》理论结合实践,讲解深入浅出,适合有一定C#语言基础的Web开发人员阅读,尤其适合想要建立软件开发知识体系并提高开发水平的Web程序员阅读。另外,《Web开发者晋级之道:架构、模式和领域驱动设计》还可以作为相关培训机构的教材。
以架构和模式为起点,深入介绍应用软件开发的思想和方法
通过一个Web项目,详解领域驱动设计的支撑技术和落地过程
从软件的设计思想、架构和开发模式的角度详解Web应用开发
通过一个电商项目案例,展现基于ASP.NET Core的Web应用开发的完整流程
将软件设计思想和项目实践相结合,详解如何开发一个高效、稳定的Web应用系统
全面、深入地介绍领域驱动设计的核心思想及其支撑技术
Web应用程序是企业应用开发的主流领域之一,它一般采用客户端-服务器架构,用户在客户端的浏览器上进行人机交互,而重要的逻辑和数据计算则在服务器上进行。随着移动互联网的普及,手机App逐渐兴盛,它比Web应用程序有更好的用户体验,在使用的灵活性上也远超Web应用程序,以至于出现了手机App会代替Web应用程序的说法。但这种说法忽略了一个事实:一个软件,尤其是企业应用软件,其核心在于解决问题的领域模型。从这个角度看,手机App和Web应用程序的区别仅仅在于人机交互方式的不同,手机App同样采用客户端-服务器架构,这和Web应用程序一样,其有价值的核心代码仍然运行在服务器上。事实上,手机App和Web应用往往使用的是同一个服务器。
随着物联网技术的发展,软件的交互方式更加丰富,很多联网的硬件可以和软件系统进行交互,而不仅限于人机交互。这些智能硬件作为新的交互方式将会大大改变软件的模式。手机App和Web应用程序作为流行的交互方式,将与智能硬件交互方式共存。交互方式本质上也是企业应用中流程控制的一种方式,就算Web应用程序会进化到所谓的流程嵌入软件的程度,运行在服务器端的越来越复杂的领域模型代码也不会改变。
开发一个功能强大、性能稳定、使用灵活和易扩展的Web应用程序离不开编程语言的支持,更离不开软件工程的支持。如果说软件产品是现实的抽象,那么软件工程就是抽象的抽象,或者说是对软件开发过程和解决方案的提炼与重用。对于开发人员而言,编程语言是基础,但其对软件工程的理解程度决定了他所开发的软件的质量。可以说软件工程的重要性要远大于编程语言本身,毕竟软件是思想的产物,而语言只是表达思想的手段。
目前,已经出版的Web开发类图书大多都把重点放在了Web框架的使用和项目的编码实现上,而鲜见一本从软件的设计思想、架构和开发模式的角度讲解Web开发的图书。这便是笔者写作《Web开发者晋级之道:架构、模式和领域驱动设计》的原因。《Web开发者晋级之道:架构、模式和领域驱动设计》将带领读者快速建立软件开发的知识体系,了解基于ASP.NET Core的项目案例的开发过程,从而帮助读者系统地学习开发高效、稳定的Web应用程序所需要掌握的知识。
《Web开发者晋级之道:架构、模式和领域驱动设计》特色
- 不局限于Web框架的介绍,而是以架构和模式为起点,全面介绍应用软件解决问题的思路和方法。这些思路和方法是新入职开发人员所缺乏的,也是他们职业晋级所的。
- 通过一个Web应用项目案例,详细介绍领域驱动设计的落地过程和支撑技术,这对于Web应用开发人员而言有较高的参考价值。
- 用理论结合实战的方式进行讲解,帮助读者快速掌握项目开发的相关知识和技巧。
- 《Web开发者晋级之道:架构、模式和领域驱动设计》的项目案例源代码具有较高的工程应用价值,读者稍加修改即可用于自己的项目开发中。
《Web开发者晋级之道:架构、模式和领域驱动设计》内容
第1篇 软件开发内功心法
第1章主要介绍开发一个软件项目需要面对的几个问题,包括领域模型的创建、架构的选择、软件框架的使用和数据存储的实现。
第2章主要介绍软件的发展历程,以及几种主流编程规范的特点和它们在描述问题、解决问题时的思想。其中,重点介绍面向对象和面向组件的编程思想,这是后续章节中要频繁使用的。
第3章围绕软件架构展开,主要介绍架构的概念、意义和描述架构的4 1视图,并介绍几种Web应用的常用架构,以及它们之间的演进过程。
第4章主要介绍面向对象程序设计的六大原则和设计模式的相关知识,这些原则用于指导开发人员在面向对象的程序设计中避免错误的选择,而更具象的设计模式则是这些原则的实际应用。
第5章介绍项目案例iShopping的背景知识,以及如何用4 1视图设计和描述项目架构。该项目是用流行的ASP.NET Core框架实现的,它是一款非常典型的企业级Web应用。
第2篇 领域驱动设计落地
第6章介绍领域驱动设计的工具,以及组成领域模型的基本元素的概念和意义。
第7章介绍如何综合运用第6章中介绍的工具和元素创建项目案例的领域模型。
第8~10章分别对iShopping系统的基础设施层、应用程序层和UI层的实现展开讲解,展示一个Web应用程序的完整实现过程。
配套资源获取方式
《Web开发者晋级之道:架构、模式和领域驱动设计》项目案例的完整源代码需要读者自行下载。请在华章公司的网站(www.hzbook.com)上搜索到《Web开发者晋级之道:架构、模式和领域驱动设计》,然后单击资料下载按钮,即可在《Web开发者晋级之道:架构、模式和领域驱动设计》页面上找到下载链接。另外,读者还可以通过https://e.coding.net/ishopping/ishopping/iShopping.git网站进行获取。
读者对象
《Web开发者晋级之道:架构、模式和领域驱动设计》适合以下读者阅读:
- 有一定C#基础的Web开发人员;
- 想提升Web项目开发水平的程序员;
- Web开发项目经理;
- 高校相关专业的学生;
- 相关培训机构的学员。
《Web开发者晋级之道:架构、模式和领域驱动设计》意在帮助新入行的软件开发人员和编程爱好者快速了解和掌握基于ASP.NET Core 的Web应用程序开发技术。阅读本书需要读者具备基本的C#语言基础和面向对象程序设计的基础知识。另外,建议读者对统一建模语言(Unified Modeling Language,UML)也要有所了解,这有助于更好地理解书中的模型。
致谢
编写本书遇到的困难远超笔者的想象。如果没有家人和朋友的支持,很难想象笔者能完成这本书的写作。在此首先要感谢笔者的家人,在编写本书的一年多的时间里,笔者陪伴他们太少。另外还要感谢参与本书出版的编辑,他们一次次不厌其烦地帮我出谋划策并细心地修改书稿,才得以让本书顺利出版。后感谢读者朋友们,本书因你们而有价值。
……
前言
第1篇 软件开发内功心法
第1章 如何开始一个软件项目 2
1.1 软件项目开发面临的挑战 2
1.1.1 领域模型的创建 3
1.1.2 架构的选择 4
1.1.3 软件框架的使用 5
1.1.4 数据存储的实现 6
1.2 小结 6
第2章 软件如何解决问题 7
2.1 软件的发展历程 7
2.1.1 面向过程的编程 8
2.1.2 面向对象的编程 9
2.1.3 面向组件的编程 16
2.1.4 面向方面的编程 19
2.1.5 综述 21
2.2 对象的意义 21
2.2.1 对象和类型 22
2.2.2 对象的创建和生命周期的控制 23
2.2.3 对象的依赖 26
2.3 组件 26
2.3.1 接口与实现分离 27
2.3.2 接口分解 30
2.3.3 接口的多重实现与继承 33
2.3.4 接口与契约式编程 34
2.4 小结 35
第3章 软件架构 36
3.1 软件架构概述 36
3.1.1 软件架构的定义 36
3.1.2 软件架构风格和架构模式 38
3.1.3 4 1视图 40
3.2 主流软件架构简介 41
3.2.1 分层架构 41
3.2.2 MVC架构 45
3.2.3 REST架构 47
3.2.4 微服务架构 52
3.3 小结 54
第4章 面向对象的设计模式和原则 55
4.1 重用 55
4.1.1 继承重用 56
4.1.2 组合重用 60
4.1.3 模式重用 62
4.2 面向对象的设计原则 63
4.2.1 单一职责原则 63
4.2.2 开闭原则 65
4.2.3 里氏代换原则 67
4.2.4 依赖倒置原则 71
4.2.5 接口隔离原则 73
4.2.6 迪米特法则 75
4.3 设计模式 79
4.3.1 设计模式的定义 80
4.3.2 设计模式的分类和应用 80
4.3.3 如何使用设计模式 81
4.4 小结 81
第5章 项目概况与架构设计 83
5.1 iShopping项目 83
5.1.1 项目简介 83
5.1.2 用Java还是.NET Core 84
5.1.3 集成开发环境 85
5.2 iShopping的架构设计 86
5.2.1 领域驱动设计和逻辑视图 86
5.2.2 开发视图 88
5.2.3 进程视图 89
5.2.4 物理视图 91
5.2.5 场景视图 92
5.3 小结 93
第2篇 领域驱动设计落地
第6章 领域模型 96
6.1 领域驱动设计 96
6.2 领域对象的识别与创建 98
6.2.1 实体对象 99
6.2.2 实体对象的标识和替换 104
6.2.3 值对象 108
6.2.4 用值对象封装复杂的逻辑 114
6.3 整体设计 124
6.3.1 领域的划分 125
6.3.2 限界上下文 127
6.3.3 限界上下文的映射 128
6.4 聚合 142
6.4.1 聚合对象 142
6.4.2 使用聚合对象实现限界上下文 143
6.4.3 聚合对象之间的导航 151
6.4.4 聚合内部对象的实现和引用 156
6.5 领域服务对象 157
6.5.1 领域服务 158
6.5.2 领域服务和应用服务 160
6.5.3 领域服务与贫血模型 161
6.6 领域事件 163
6.6.1 领域事件简介 164
6.6.2 领域事件的发布和订阅 166
6.7 领域对象的生命周期 176
6.7.1 工厂和构建器 176
6.7.2 仓储对象 179
6.8 小结 182
第7章 综合运用领域模型 183
7.1 商品目录上下文的实现 183
7.1.1 商品分类聚合的实现 184
7.1.2 商品聚合的实现 192
7.2 订单上下文的实现 202
7.2.1 购物车聚合的实现 204
7.2.2 订单聚合的实现 210
7.2.3 订单优惠聚合的实现 224
7.2.4 订单费用计算服务的实现 229
7.3 小结 232
第8章 基础设施层的实现 233
8.1 基础设施层的创建 233
8.2 数据存储 234
8.2.1 数据库设计范式 235
8.2.2 事务 238
8.2.3 NoSQL数据库 240
8.3 对象关系映射 241
8.3.1 对象-数据库阻抗失配 241
8.3.2 对象关系映射的困难 242
8.3.3 传统的数据访问技术ADO.NET 243
8.4 Entity Framework Core框架 247
8.4.1 Entity Framework Core的引用 247
8.4.2 Entity Framework Core简介 249
8.4.3 实现自定义数据上下文 252
8.4.4 实现对象仓储 270
8.5 MongoDB应用 280
8.5.1 MongoDB数据库 281
8.5.2 使用MongoDB实现对象仓储 283
8.6 RabbitMQ应用 287
8.6.1 RabbitMQ的安装和配置 288
8.6.2 使用RabbitMQ实现事件总线 290
8.7 使用第三方WebAPI 297
8.7.1 WebAPI访问技术 297
8.7.2 使用WebAPI实现运输距离的计算 300
8.8 小结 303
第9章 应用程序层的实现 304
9.1 应用程序层简介 304
9.1.1 应用程序层和应用服务 306
9.1.2 应用服务的接口形式 310
9.1.3 CQRS风格的应用服务 312
9.1.4 事件存储 317
9.2 实现查询的方法 319
9.2.1 对象的映射 319
9.2.2 查询过滤器 321
9.2.3 数据代理 327
9.2.4 查询门面 334
9.3 小结 341
第10章 展示层和MVC框架 342
10.1 ASP.NET Core MVC框架 342
10.1.1 路由 343
10.1.2 MVC简介 346
10.1.3 控制器 349
10.1.4 控制器和领域模型 352
10.1.5 视图和模型 354
10.1.6 OWIN和反向代理 358
10.2 ASP.NET Core MVC项目 361
10.2.1 搭建MVC 362
10.2.2 依赖注入容器 367
10.2.3 搭建前端开发框架 371
10.3 控制器和视图的实现 372
10.3.1 控制器和视图 373
10.3.2 视图的表单提交 377
10.3.3 视图与服务器的异步通信 379
10.4 小结 382
……