第51期-零度框架基于.NET6的重构与升级
- 2022/3/19 10:56 | 93分钟
- VIP
更改目标框架为 .NET 6 版本,更新所有包引用,使用最小托管模型,将 Startup 与新的最小托管模型结合使用,升级 IdentityServer 版本,重构项目代码,解决代码错误警告建议, 基于 JavaScript 和 TypeScript 项目的 SDK 模板, 修正可空引用类型,使用源代码生成器记录强类型语义日志,升级 OAuth 外部身份认证提供程序。
更改目标框架为 .NET 6 版本,更新所有包引用,使用最小托管模型,将 Startup 与新的最小托管模型结合使用,升级 IdentityServer 版本,重构项目代码,解决代码错误警告建议, 基于 JavaScript 和 TypeScript 项目的 SDK 模板, 修正可空引用类型,使用源代码生成器记录强类型语义日志,升级 OAuth 外部身份认证提供程序。
学习微软开源 YARP 反向代理服务器,在零度框架微服务中集成网关,路由和负载均衡集群节点配置,支持认证与授权,会话粘性和一致性,负载均衡切换算法,中间件扩展,请求转换,微服务健康状况监测,分布式跟踪,支持 gRPC 请求代理转发。
使用前端请求管道传递 JwtBearer 访问令牌,设计并加载用户配置信息和权限访问控制列表,可见性权限控制,细粒度操作按钮权限控制组件,路由与菜单权限控制,基于多租户授权主体生成权限演示数据,重构并修复多租户数据筛选器,重构权限断言相关服务的依赖注入生命周期,重构租户管道中间件执行顺序,实战演练完整的权限系统。
前端客户端 Identity Server 授权配置 ,前端客户端登录与登录回调,前端客户端注销与注销回调,使用 OIDC 前端库实现基于 OAuth2 协议的用户会话和访问令牌管理,编写基于 React 的认证与授权页面,配置路由,未登录时跳转到登录页面,登录后跳转到回调页面,获取用户信息,用户退出跳转,调试 React 应用的方法和技巧。
领域层仓储实现批量创建,批量更新,批量删除,批量操作性能优化与相关开源库,使用仓储加载实体的导航属性,预加载和显式加载,基于依赖注入配置导航属性默认加载项,使用部分类和扩展方法分割代码,提高代码的可维护性,常用命名规范说明。
表格批量删除配置,多选与全选操作,弹出批量操作工具条,在工具条上添置自定义组件和布局,字符串插值格式化,学习前端累加器,析构对象参数,异步调用后台接口实现批量删除,使用浮动组件提高批量操作的用户体验,列表页面的用户体验设计价值观。
删除确认设计,基于回收站和操作版本历史记录的设计可以提高用户体验,气泡确认框组件,警告提示组件,全局消息提示组件,对话框组件,通知提示框组件,在操作列上实现删除功能,异步删除,加载中实现,使用前端代理调用后端接口实现删除,在后端模拟耗时操作后测试前端加载功能的体验。
前端验证与后端验证,模态弹框表单更改为抽屉式表单,编写自定义组件,在表格操作列上绑定编辑行为,实现抽屉式编辑表单,组件之间传值,使用钩子进行值回传,使用自定义组件,快速绑定表单数据,调用后台接口实现修改功能,关于通用 CRUD 服务中特定字段更新操作的改进与说明。
弹框创建对话框,表单与表单项,模态对话框,抽屉对话框,表单组件,各种各样的浮层表单,分步骤填写的表单,配置表单项数据验证规则,组件的引用与行为调用,提交表单前自动验证,调用后台接口实现创建功能,创建后刷新表格数据,弹出成功提示消息框。
自动生成表格列搜索,自定义搜索渲染器,根据用户设备分辨率实现动态响应式布局,使用过滤器实现搜索,使用抽屉组件展示列详情,使用描述列表展示详情内容,使用 React 状态钩子存储当前选择的行和抽屉状态,理解组件与状态的绑定关系,使用骨架屏提高用户加载数据的体验。
设计分页与排序模型,多字段联合排序描述器,在应用服务中使用排序描述器对列表排序,使用字段名称生成排序表达式,实现排序规则模型绑定器和模型绑定提供者,配置排序模型绑定提供者,前端列表传递排序参数,基于通用模型自定义数据查询模型,重写数据过滤器,在前端启用关键字搜索。
使用过滤器扩展 OpenApi 组件,使用 UMI 工具链基于 OpenApi 文档生成前端接口请求代理,表格组件的基本配置与多语言实现,请求后台 WebApi 接口绑定数据,数据表分页,使用代理服务解决跨域问题和接口数据模拟,完全实现前后端分离开发模式。
默认登录逻辑的实现,站点布局主题配置,修改站点信息和模板页,推荐 SVG 格式的矢量 LOGO 图标,设置页头和页脚内容,实现中英文多语言内容切换,编写页面组件,将页面组件关联到路由菜单,配置路由菜单支持多语言,分割多语言资源文件。
初始化前端项目,将前端框架集成到零度解决方案,前端项目版本控制,使用 Visual Studio Code 开发前端 React 项目并实现自动化编译和运行,启动项目,前端项目文件夹结构,页面代码结构解析,使用 UMI 插件基于 OpenApi 帮助文档自动化生成前端代码,生成接口前端模拟数据,将前端项目打包发布到生产平台。
关于 NODE.JS 环境安装,学会 NPM 和 YARN 包管理器,使用 UMI 工具初始化前端脚手架,快速创建 ANT DESIGN PRO 脚手架,使用包管理器安装依赖项,编译并启动前端应用程序,开启 UMI UI 工具,使用 UMI 提供的模板快速开发前端通用界面和功能,所见即所得的快速增量编译和浏览器自动刷新,使用 Visual Studio Code 开发前端 React 项目并实现自动化编译和运行。
零度框架前端技术栈,React 是用于构建前端用户界面的 JavaScript 库,声明式,组件化,一次学习,跨平台编写,学习基于 Ant Design 设计体系和价值观,Antd 是一整套基于 React UI 的组件库,主要用于快速开发企业级中后台应用,Ant Design Pro 提供开箱即用的中台前端和设计解决方案。
在命令处理流程中使用拦截器横切关注点,在 MediatR 命令管道中使用 Behavior 行为拦截 Handler 命令处理器,日志记录行为拦截器,命令验证行为拦截器,分布式日志行为拦截器,将具有泛型参数的行为拦截器注入到容器中,将零度框架项目中引用的包升级到最新版,善用剪贴板历史记录提高粘贴效率,在 NPM 包控制台执行多条数据库迁移命令。
在基于 DDD 领域模型驱动设计的微服务中,实现 CQRS 查询与命令分离,使用 MediatR 实现 Command 命令模式,编排命令和命令处理程序,将命令封送到命令分发器,使用命令处理程序处理请求,命令不具幂等性,使用装饰器设计模式封装命令去重机制,解决由于网络等其它问题导致的命令重试去重,使用去重命令处理器分发子命令。
理解 CQRS 命令和查询职责分离模式,在传统的体系结构中,使用同一数据模型查询和更新数据库,为提高数据库的扩展性,使用 CQRS 模式将读取和写入分离到不同的应用模型中,关于数据库读写分离后的主从复制可靠性,在零度框架中使用 Dapper 实现 CQRS 查询模式,抽象并实现数据库连接工厂接口,通过示例学习 CQRS 模式的使用方法,优雅地实现数据记录分页和关键字搜索。
租户信息与连接字符串配置,连接字符串提供者接口,默认连接字符串提供者实现,多租户连接字符串提供者实现,从远程租户配置系统读取接字符串,使用数据库连接拦截器动态变更连接字符串,多租户独立数据库部署和迁移方案。
租户信息异步线程上下文,使用中间件在提取租户信息,多租户数据隔离筛选器,为添加的实体自动设置租户编号,软删除全局筛选器,保存实体变更时分发领域事件,使用保存变更拦截器横切关注点,生成基于多租户和软删除的产品演示数据。
租户与用户的关系,在用户表添加租户字段,自定义用户声明信息工厂,在访问令牌中关联租户编号,生成租户演示数据,租户系统二次开发和设计,不同租户下用户名的唯一性和重复性,租户用户名规则,为租户提供不同的域名或访问地址。
定义权限策略常量,实现权限定义提供者,显示多语言本地化权限,在容器中自动注入授权相关的接口和实现,在控制器和操作上注解权限策略,生成权限演示数据,运行并演示授权机制,重构权限操作需求,设计并实现基于数据资源的动态授权机制。
设置微服务启动端口,在生产平台中部署 OpenAPI 帮助文档,导入演示数据,创建安全操作过滤器,在 IdentityServer 上配置 CORS 跨域资源共享,在 OpenAPI 帮助文档中配置 OAuth 身份认证授权方式,基于 JWT 令牌的 Bearer 身份认证方式,在 API 操作上注解授权特性,基于策略和角色的授权,匿名访问时跳过授权。
支持第三方外部社交账号登录方式,关于开源 OAuthHandler 处理程序,集成微信登录,集成 QQ 登录,集成支付宝登录,集成微博登录,集成微软账号登录,集成 GitHub 登录,支持更多社交账号登录方式,在配置文件中配置客户端密钥信息,在容器中注入外部认证方式,质询并跳转到第三方外部登录,处理外部登录回调流程。
创建注销模型,实现注销方法,创建注销确认视图,演示注销流程,创建重置密码模型,实现模型多语言本地化,创建重置密码方法,创建重置密码视图,使用手机验证码重置密码流程,使用工具生成令牌签名所需的数字证书,配置并读取数字证书,演示授权确认页面和接口请求流程。
理解授权机制工作原理,终端用户,客户端,身份服务器,资源提供者,访问令牌,身份令牌,实现授权确认机制,创建授权确认模型,授权确认控制器,多语言授权确认视图,测试授权过程与请求地址。
集成阿里云服务接口,统一处理接口认证,使用短信开放接口,发送短信和邮件,创建注册视图模型并对元数据进行本地化多语言,创建多语言注册视图,注册模型验证,处理远程异步验证,实现前端发送验证码。
统一身份认证授权中心需要对外提供登录,注册,双重身份认证,重置密码,找回密码,第三方登录方式,登录控制器,登录界面,视图的本地化与多语言,用户管理与登录管理,实现多语言模型和界面,本地验证与服务端验证,登录成功进入欢迎界面,展示当前登录用户的声明信息。
IdentityServer 是基于 .NET 平台开源的 OpenID Connect 和 OAuth 框架,提供身份认证,单点登录,单点注销,使用令牌对 API 访问控制,可集成外部身份提供商,具有高可扩展性,在零度微服务框架中实现单点登录和令牌颁发服务,关于授权中心的用户数据,客户端数据,运行时数据的持久化存储方案,配置依赖注入容器,数据库迁移,生成一些可测试的演示数据。
权限策略定义,授权处理器,授权过程,实现权限应用服务和数据传输对象,查询指定主体的权限分组树,为主体分配指定的权限,生成授权演示数据,使用 WebAPI 权限控制器查询和分配权限,测试并演示授权流程。
关于灵活可扩展授权机制的工作流程,身份认证的目的是确定用户的身份主体,而授权是针对身份主体分配资源的操作权限,理解身份主体,权限策略,资源,操作,授权决定,授权制行,实现 ACL 访问控制列表,使用自定义的仓储存储权限授予列表,基于分布式缓存的权限存储器,可扩展的权限值提供者接口,权限断言检查器,自定义授权处理器。
理解基于策略的授权机制,灵活且可扩展的权限定义系统,基于树型结构的权限定义,权限分组定义,权限定义上下文,设计权限定义提供者接口,实现权限定义提供者接口,权限显示名称的本地化多语言,权限定义管理器,扩展微软默认的授权策略提供者,从权限管理器查询权限,并将权限定义转换为授权策略,自定义授权策略提供者的回退机制。
使用 OpenAPI 生成优雅美观的在线帮助文档,在项目中添加 OpenAPI 支持,配置 Swagger 依赖注入和中间件,定制并修改页面模板结构,使用样式表美化帮助文档界面,定制图标和品牌标识,使用 Swagger 测试 WebAPI 接口,使用 Curl 命令发起 HTTP 请求并测试 WebAPI 接口。
简化 Startup 启动类配置,横向扩展启动类,分离依赖注入和中间件管道的配置,使用 IHostingStartup 接口在启动时从外部程序集向应用添加增强功能,动态配置服务容器,使用 IStartupFilter 筛选器接口动态扩展 Startup 启动类,动态配置中间件管道,实现自定义 IMvcBuilder 扩展方法。
基于 FluentValidation 链式验证消息的多语言实现,实现并替换默认多语言错误消息,属性显示名称多语言,在模型链式验证器中自定义错误消息并实现多语言,开源的资源文件编辑管理器,资源文件最优雅的编辑方式,使用工具自动翻译并生成多语言资源文件。
国际化,全球化,本地化,区域性,学习 .NET 框架中的语言文化相关类,关于 ASP.NET Core 的全球化与本地化,实现多语言切换功能,基于数据注解验证机制的错误消息多语言,属性显示名称多语言,定制替换微软提供的默认错误消息并实现多语言。
在零度框架中实现可扩展的模型验证机制,微软 .NET 框架中基于特性的数据注解验证方式,定制默认错误消息,基于 FluentValidation 实现链式验证,编写链式验证器,在依赖容器中自动注入验证,在 WebAPI 中启用自动模型验证,在代码中调用验证器,同时支持注解验证和链式验证。
数据传输对象 DTO 用于在应用程序层和客户端表现层之间传输数据,理解使用 DTO 数据传输对象的优缺点,实现基于 CRUD 增删改查操作的通用泛型应用服务,使用 AutoMapper 自动映射实体和 DTO 对象,将映射规则的配置自动注入到依赖容器,基于泛型通用应用服务自定义应用服务,在依赖容器中注入泛型应用服务。
理解领域服务与应用服务的区别,应用服务用于实现应用程序的用例,它用于将领域服务的逻辑公开给表现层,在框架中设计并实现应用服务,理解并实现 DTO 数据传输对象,实现 CRUD 增删改查操作,实现分页与排序,在依赖容器中注册应用服务,在表现层 Web API 中调用应用服务接口实现业务用例,使用 Watch 监视命令启动并测试项目。
本地领域事件与分布式队列集成事件的区别,使用中介者模式实现本地领域事件机制,可避免交互对象之间的紧耦合关系,实现领域事件接口,当持久化聚合根或实体时自动分发领域事件,编写领域事件,使用 MediatR 中介者实现发布订阅机制,领域事件订阅处理器,在容器中动态注入领域事件订阅者。
设计软删除与多租户接口,使用全局过滤器查询软删除和多租户数据,租户数据存储与租户连接字符串,租户相关实体映射,使用变更跟踪器实现软删除,当前租户访问器,使用 AsyncLocal 和 Dispose 模式实现租户环境灵活切换,通过多租户中间件拦截请求并在上下文中提取租户信息。
使用设计时工厂创建 DbContext 迁移上下文,与 EF Core 无关的数据库初始化与演示数据生成机制,设计数据初始化提供者接口,实现数据初始化接口并在容器中自动注入,在请求管道中启动数据初始化机制,返回可空的实体类型,使用链式依赖注入,项目文档约定,基于通用仓储 实现自定义仓储。
自动加载模型配置,实体模型映射配置,主键配置,字段约束配置,索引配置,数据表关系配置,自定义值转换器,元组类型与析构器,使用 DbContext 实现泛型通用仓储,依赖容器注入约定,在容器中注入 DbContext 上下文,使用池提高上下文创建性能,在容器中注入 DbContext 上下文工厂,数据库连接重试机制,在容器中注入泛型通用仓储。
学习并理解基础设施层的作用,基础设施层为其它层提供通用的技术能力,提供层间的通信,为领域层实现持久化机制,使用 Entity Framework 框架实现通用泛型仓储,实现异步查询提供者,加载关联数据,领域异常设计,动态生成规约表达,实现并使用规约计算器查询数据,使用 DbContext 上下文实现工作单元。
规约模式用于定义可重用、可组合、有意义和可测试的过滤器,简单地说,规约模式就是对查询条件表达式用类的形式进行封装,使用第三方开源代码设计并构建自己的规约模式,抽象规约接口与基本实现,规约计算器,在仓储模式中支持规约查询,规约的组合与生成器,在领域服务中使用规约查询数据。
仓储和工作单元模式旨在创建应用程序的业务逻辑层和数据访问提供程序之间的抽象,实现这些模式可让你的应用程序对数据数据持久层的变化不敏感,从而提供对数据访问层的灵活扩展,而且很容易进行自动化单元测试和进行测试驱动开发,实战演练,在项目框架中实现通用泛型仓储和工作单元模式,抽象异步查询器,在仓储上扩展异步查询器。
理解领域模型驱动设计,设计抽象的实体基类,具有独立主键的实体和具有复合主键的实体,设计聚合根接口,设计领域事件通知,多租户接口设计,值对象基类设计,使用记录类型实现值对象,通过示例实战演示,实体聚合根值对象在项目中的应用,通过几个示例学习抽象基类的各种用法。
在框架中支持可空的引用类型,使用可为空和不可为空引用类型更清晰地表达设计意图,使用特性注解有助于编译器对可空引用状态的静态分析,使用可为空引用类型迁移现有代码,可以通过使用可空包容运算符消除警告,修改框架项目文件以支持可空引用类型检查。
同步通信与异步通信,实现微服务架构中的事件总线,抽象可扩展的事件总线接口,设计可扩展的事件总线,消息事件定义,事件总线接口抽象,事件处理程序抽象,基于动态类型的事件处理程序,事件与订阅者管理器,使用 RabbitMQ 实现事件总线接口,使用指数退避算法实现连接复原。
从零开始搭建基于微服务和领域模型驱动设计的分层架构,零度开源仓库地址介绍,学习微软官方最新编码规范,零度框架的搭建以开发简单,多屏体验,前后端分离,灵活部署,最少依赖,最新框架为原则,以物联网平台管理系统为业务模型,参考诸多优秀开源框架,采用主流稳定的技术栈,从零开始搭建企业级架构。