在复杂系统的架构设计中引入设计原则与模式,能够极大降低复杂系统开发.和维护的成本 目录 几个问题 为什么要学习设计模式 优良架构设计的具体指标 理解复杂系统 面向对象思想(指导复杂系统的分析.设计.实现) 设计原则 设计模式 几个问题 单一职责原则的职责是什么 依赖倒置中的依赖是什么?(依赖注入DI,和 IOC 控制反转) 组合与聚合的区别是什么 贫血模型与充血模型的差异在什么地方 阅读开源项目代码时,单个方法可以理解,整体看不懂 为什么要学习设计模式 有助于更快地读懂开源项目代码 自己编写通用…
目录 模块拆分 代码重构 模块拆分 代码重构 AuthenticationController PermissionController IAuthorizationMiddlewareResultHandler ISaveChangesInterceptor AuthenticationController 新增 AuthenticationController 用于登录和注册:登录会颁发 jwt token,包含用户的 claims 和 role 的 claims 登录 [HttpPost]…
目录 目标 源码 目标 理解 KestrelServer 如何接收网络请求,网络请求如何转换成 http request context(C# 可识别) 源码 https://github.com/dotnet/aspnetcore/ 在目录 aspnetcore\src\Servers\Kestrel\Core\src\Internal 下有一个 KestrelServerImpl internal class KestrelServerImpl : IServer 在 host 启动的时候调…
目录 什么是软件架构 软件架构的基本思路 单体向分布式演进.云原生.技术中台 1.1 什么是软件架构 1.1.1 什么是架构? Software architecture = {Elements, Forms, Rationale/Constraints} 元素.形式/模式.基本原理和限制 为什么需要软件架构? 软件架构的终极目标是用最小的人力成本来满足构建和维护系统的需求 一个软件架构的优劣,可以用它满足用户需求的成本来衡量.如果该成本很低,并且在系统的整个生命周期内一直都维持这样的低成本,那…
目录 目标 ASP .NET Core 什么是系统 什么是系统思维 系统分解 什么是复杂系统 作业 目标 通过整体定义去认识系统 通过分解去简化对系统的认识 ASP .NET Core ASP .NET Core 是什么 ASP .NET Core 是干什么的 Host.Server.HostApplication 与 ASP .NET Core 是什么关系 ASP .NET Core 和 .NET Core 是什么关系 ASP .NET Core 是什么 WEB FRAMEWORK(形式) A…
目录 项目核心内容 实战目标 RGCA 四步架构法 项目核心内容 无代码埋点实现对所有 API Action 访问控制管理 对 EF Core 实体新增.删除.字段级读写控制管理 与 Identity 进行融合集成 实战目标 RGCA 四步架构法的应用 加深对 OPM 和 OPD 的运用 为毕业设计打下基础 RGCA 四步架构法 Requirement:从利益相关者获取需求 Goal:将需求转化为目标(功能意图) Concept:将目标扩展为完整概念 Architecture:将概念扩展为架构…
2.7.1 敏捷开发 敏捷介绍 敏捷的起源 敏捷软件开发宣言 敏捷开发十二原则 生命周期对比 敏捷开发的特点 敏捷的发展 敏捷的核心 敏捷的起源 2001年,17个老头子在一起一边滑雪,一边讨论工作,制定了<敏捷软件开发宣言> 从60年代中期开始到20世纪末,软件行业得到了非常迅猛的发展,软件系统的规模和复杂度也越来越高,行业普遍面临不满足需求,永远无法交付等一系列严重的问题,史称"软件危机" 从长期积累的经验看,早期阶段的时间投入会影响到后期的经济支出,就是需求变化发生的…
2.5.1 MongoDB -- 介绍 mysql vs mongo 快速开始 mysql vs mongo 对比 mysql mongo 数据存储 table 二维表结构,需要预先定义结构 json 类文档,不需要预先定义结构.可随意新增或删除字段,新增字段不会对已存在的字段产生影响 查询语法 sql (structured query language) mongo 索引 如果不定义索引,则进行全表扫描 如果不定义索引,则进行全表扫描 集群 支持主从复制 内置副本集.分片.和自动选举 场景…
2.5.6 MongoDB -- 问答系统 MongoDB 数据库设计 API 实现概述 MongoDB 数据库设计 设计优化 内嵌(mongo)还是引用(mysql) 数据一致性 范式:将数据分散到不同的集合:反范式:使用内嵌文档 在范式化的情况下需要在进行多次查询再拼装数据,或者使用 lookup,即跨表查询:反范式化的情况下可以直接查出相关数据 更适合内嵌 更适合引用 子文档较小 子文档较大 数据不会定期改变 数据经常改变 最终数据一致即可 中间阶段数据必须一致 文档数据小幅增加 文档数据…
2.7.3 Scrum 团队 理想的环境 团队章程 如何组建 Scrum 团队 产品待办事项列表 用户故事 敏捷开发流程 理想的环境 5-9人 100% 跨职能 在一起 自组织 自组织 目标 授权 沟通 可视化 辅导 奖励 要我做 => 我想做,我要做,我要做好 团队章程 团队价值观:速度与工作时间 工作协议:例如:"就绪"定义,"完成"定义 基础规则:例如:会议规则 团队规范:迟到.冲突 坦诚.高效沟通 包容 相互帮助 简洁.反馈.尊重 如何组建 Scrum…
2.4.6 EF Core -- 更新 状态 自动变更检测 不查询删除和更新 并发 状态 Entity State Property State Entity State Added 添加 Unchanged 没有变化 Modified 已修改 Deleted 已删除 Detached 未跟踪 Property State IsModified CurrentValue OriginValue 自动变更检测 使用自动变更检测完成确定字段的更新 使用自动变更检测完成任意字段的更新 使用自动变更检测…
2.5.3 MongoDB -- 写入和查询 写入 查询 查找操作符 逻辑操作符 其他 嵌套对象 数组 游标方法 写入 https://docs.mongodb.com/manual/tutorial/insert-documents/ insertOne insertMany db.questions.insert( { "_id":"003", "title":"第三个问题", "view":0, &q…
2.5.4 MongoDB -- 更新和删除 整体更新 更新字段 字段操作 数组操作 删除 https://docs.mongodb.com/manual/reference/operator/update/ updateOne updateMany replaceOne 整体更新 db.questions.replaceOne({},{}) 更新字段 db.author.updateOne({"name":"mingson"}, { $set: {"ag…
2.5.5 MongoDB -- 聚合 排序 索引类型 创建索引 排序 // 升序 db.getCollection('author').find({}).sort({"age": 1}).limit(20) // 降序 db.getCollection('author').find({}).sort({"age": -1}).limit(20) // 组合 db.getCollection('author').find({}).sort({"age&qu…
2.5.7 MongoDB -- API实现 问题查询单个实现 问题查询列表实现 问题跨集合查询实现 问题创建实现 问题更新实现 问题回答实现 问题评论实现 问题投票实现 回答实现 QuestionController namespace LighterApi.Controller { [ApiController] [Route("api/[controller]")] public class QuestionController : ControllerBase { privat…
2.5.8 MongoDB -- API重构 Lighter.Domain Lighter.Application.Contract Lighter.Application LighterApi Lighter.Application.Tests Lighter.Domain 将数据实体转移到 Lighter.Domain 层 Lighter.Application.Contract 将业务从controller 抽取到 Lighter.Application 层,并为业务建立抽象接口 Ligh…
2.6.1 消息队列 -- 介绍 主要使用场景 队列的三种形式 消息队列的优点 主要使用场景 典型的异步处理 流量削锋 应用解耦 队列的三种形式 点对点 工作队列 发布与订阅 消息队列的优点 1.屏蔽异构平台的细节:发送方.接收方系统之间不需要了解双方,只需认识消息. 2.异步:消息堆积能力:发送方接收方不需同时在线,发送方接收方不需同时扩容(削峰). 3.解耦:防止引入过多的API给系统的稳定性带来风险:调用方使用不当会给被调用方系统造成压力,被调用方处理不当会降低调用方系统的响应能力. 4.…
2.6.3 RabbitMQ -- HelloWorld 发送端 接收端 rabbitmq container 发送信息 https://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html 新建控制台项目 Sender,Receiver 添加 nuget 包:RabbitMQ.Client 发送端 namespace Sender { class Sender { public static void Main() { var factory…
2.6.4 RabbitMQ -- 工作队列和交换机 WorkQueue Publish/Subscribe Routing EmitLog WorkQueue WorkQueue:https://www.rabbitmq.com/tutorials/tutorial-two-dotnet.html 一个消息生产者,多个消息消费者 exchange 交换机自动恢复 对消息进行持久化 手动确认消息 对消息进行持久化 var properties = channel.CreateBasicPrope…
2.6.6 RabbitMQ -- Masstransit 介绍 Masstransit 是什么 Quickstart 消息 Message Masstransit 是什么 Masstransit 是一个 .NET 免费开源的分布式应用框架 集成多种消息中间件(Rabbitmq, Azure, Service Bus, ActiveMQ, Kafka, In-Memory) 强大且完整的消息模式(发布与订阅,saga,event-driven state machine,最终一致性支持) 端到端…
2.6.7 RabbitMQ -- Masstransit 详解 Consumer 消费者 Producer 生产者 Request-Response 请求-响应 Consumer 消费者 在 MassTransit 中,一个消费者可以消费一种或多种消息 消费者的类型包括:普通消费者,saga,saga 状态机,路由活动(分布式追踪),处理器 handlers,工作消费者 job comsumers Consumer Instance Handler Others Consumer public…
2.6.8 RabbitMQ -- Masstransit 异常处理 异常处理 其他 高级功能 异常处理 异常与重试 重试配置 重试条件 重新投递信息 信箱 异常与重试 Exception public class SubmitOrderConsumer : IConsumer<SubmitOrder> { public Task Consume(ConsumeContext<SubmitOrder> context) { throw new Exception("Ver…
2.7.2 Scrum 核心 3个工件 5个会议 5个价值观 3个工件 产品待办列表(Product Backlog) Sprint 待办列表(Sprint Backlog) 产品增量(Product Increment) 5个会议 产品 Backlog 梳理会议(product backlog refinement) Sprint 迭代计划会议(Sprint Planning Meeting) 每日站会(Daily Scrum Meeting) Sprint 评审会议(Sprint Revie…
2.8 安全 认证 VS 授权 ASP .NET Core 认证授权中间件 认证 JWT 认证 授权 认证 VS 授权 认证是一个识别用户是谁的过程 授权是一个决定用户可以干什么的过程 401 Unauthorized 未授权 403 Forbidden 禁止访问 ASP .NET Core 认证授权中间件 在接收到请求之后,认证(Authentication)和授权(Authorization) 发生在 路由(Routing) 和 终结点(Endpoint) 之间 执行过程 认证 认证是一个识…
目录 UML OPM OPM优化 UML 1997年发布UML标准 主要域 视图 图 主要概念 结构 静态视图 类图 类.关联.泛化.依赖关系.实现.接口 用例视图 用例图 用例.参与者.关联.扩展.包括.用例泛化 实现视图 构件图 构件.接口.依赖关系.实现 部署视图 部署图 节点.构件.依赖关系.位置 动态 状态机视图 状态机图 状态.事件.转换.动作 活动视图 活动图 状态.活动.完成转换.分叉.结合 交互图 顺序图 交互.对象.消息.激活 协作图 协作.交互.协作角色.消息 UML 用例…
目录 对外展现的功能 内部功能 功能交互与价值通路 系统架构 目标 认识系统的价值通路 认识功能架构,通过把功能结构与形式结构结合来描述系统架构 受益原则 好的架构必须使人受益,要想把架构做好,就要专注于功能的涌现,使得系统把它的主要功能通过跨越系统边界的接口对外展示出来 对外展现的功能 ASP .NET Core 的使用者是程序员,最终的受益是老板 上一讲对 ASP .NET Core 的描述是文字性描述,是一种非结构性描述,不是很准确,因为每个人对文字的理解都不一样 ASP .NET Cor…
演化与完善整体概念 ASP .NET Core 整体概念推演 整体概念推演到具体的形式 ASP .NET Core 整体概念推演 ASP .NET Core 其实就是通过 web framework 处理 HTTP 请求并提供 HTTP 响应 web framework 由程序员使用,它包括 ASP .NET Core,Express,spring 等等组成 这样我们就完成了对 ASP .NET Core 的底层建模,接下来对 HTTP 请求和 HTTP 响应进行细化 对于原始 HTTP 请求,…
目录 目标 模块拆分 OPM 开发任务 目标 基于上一讲的模块划分做一个任务拆解,根据任务拆解实现功能 模块拆分 模块划分已经完成了边界的划分,边界内外职责清晰 OPM 根据模块拆分画出 OPM(Object Process Methodology) ActionAccess 模块中的 ActionResourceProvider 会为 RegisterActions 提供支持 Core 模块会对资源进行扫描,扫描之后会得到大量 ResourceModel,将它们持久化到 IResourceSt…
目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.Security.ActionAccess:扫描 action:添加 action authorize filter:添加集成方式 代码实现 对于一个 web 项目,Filter 是在构建构建 builder 的时候添加的 builder.Services.AddControllers(options =>…
目录 开发任务 代码实现 开发任务 DotNetNB.Security.Core:定义 core,models,Istore:实现 default memory store DotNetNB.WebApplication:创建 ResourceController 和 PermissionController 进行验证 代码实现 ResourceController PermissionController ResourceController 创建 ResourceController,通过…