第48期-应用服务
- 2020/12/30 22:40 | 46分钟
- VIP
应用服务用于实现应用程序的用户用例,用于将领域服务的逻辑公开给表现层,应用服务和数据传输对象,自动生成基于 CRUD 增删改查的应用服务,重写通用应用服务基类方法,定制查询方式,基于复合主键的通用应用服务,过滤器,分页,排序,在应用层处理数据流,验证参数,操作授权,依赖注入生命周期。
应用服务用于实现应用程序的用户用例,用于将领域服务的逻辑公开给表现层,应用服务和数据传输对象,自动生成基于 CRUD 增删改查的应用服务,重写通用应用服务基类方法,定制查询方式,基于复合主键的通用应用服务,过滤器,分页,排序,在应用层处理数据流,验证参数,操作授权,依赖注入生命周期。
关于 ABP 版本概述,将 ABP 升级 .NET 5 版本,升级 ABP 命令行工具,最新 ABP 新版中的新增内容与改进,改进 Blazor 稳定性,使用微软内置的 JSON 序列化库,提供 WPF 项目支持,改进 URL 格式规范,未来版本路线图,每晚构建,使用预览版和稳定版。
规约模式用于定义可重用、可组合、有意义和可测试的过滤器,简单地说,规约模式就是对查询条件表达式用类的形式进行封装,关于 ABP 框架中的规约模块,定义规约,检查对象是否满足某个规约,使用规约查询数据,使用运算符组合规约,使用继承方式组合规约,理解规约的使用场景,阅读分析 ABP 源码,理解规约模块的设计与实现原理。
在领域驱动设计中,核心业务逻辑一般在实体和聚合根中实现,但在某些情况下我们需要创建领域服务实现核心业务逻辑,理解领域服务和应用服务的区别,在 ABP 框架中使用领域服务实现业务规则,使用应用服务实现用户交互用例,在应用服务中调用或组合领域服务完成业务处理。
标识对于实体是必不可少的,系统中有许多对象和数据项不需要标识和标识跟踪,领域模型中的值对象具有无标识和不可变两大特征,在 ABP 框架中实现值对象,在数据库中持久保存值对象,在 EF Core 中以从属实体类型形式来持久保存值对象,阅读并分析 ABP 源码,学习关于值对象的设计与实现原理。
理解领域模型驱动设计中的概念,实体,聚合根,值对象,在 ABP 中定义带主键的实体,实体类与实体接口,具有组合键的实体,定义聚合根,聚合根类与聚合根接口,带有组合键的聚合根,实体类与聚合根类的继承层次,实现审计特征相关接口,继承审计通用类可简化审计接口实现,聚合根支持扩展属性,关于实体与聚合根的最佳实践。
使用数据库的应用程序都需要一些初始数据,在系统创建时就需要内置超级管理员用户,在开发测试阶段需要模拟一些演示数据,这些数据需要预先存储在数据库中,尽管 EF Core 提供了一种生产数据的方法,但它的能力非常有限,在 ABP 框架种提供了整套数据初始化机制,支持模块化,数据库独立,生产与开发环境分离,支持依赖注入,分析 ABP 源码,理解演示数据初始化机制的设计与实现原理。
使用内存数据库模块实现仓储模式,内存数据库对开发和测试来说非常有用,在 ABP 框架中使用内置的内存数据库,创建上下文并配置默认仓储,基于通用抽象仓储扩展自定义仓储,使用自定义仓储替换默认通用仓储,自定义并替换内存数据库仓储基类,阅读 ABP 框架源码,学习内存数据库实现原理与领域层仓储模式。
学习 NoSQL 与 MongoDB 数据库,在 Docker 容器中运行 MongoDB 数据库, 使用程序访问 MongoDB 数据库,在 ABP 框架中使用 MongoDB 模块实现仓储模式,创建上下文并配置实体映射,关于 MongoDB 连接字符串,基于通用仓储扩展自定义仓储,替换默认仓储实现,工作单元与事务支持,实现并替换默认仓储基类,抽象并提取上下文接口,替换现有的上下文实现。
关于轻量级 ORM 开源库 Dapper 介绍,在 ABP 使用 Dapper 实现仓储模式,基于现有 DbContext 使用 Dapper 模块 和 SQL 语句实现数据库操作,使用 Dapper 扩展库简化 SQL 语句,不依赖 DbContext 实现 Dapper 数据库访问仓储 ,在事务上使用 Dapper 实现操作,阅读 ABP 源码,分析 Dapper 模块实现原理。
ABP 框架为一些常见的 DBMS 提供简化的配置集成包,在 Docker 容器中运行数据库服务,安装数据库提供程序集成包,设置模块依赖与数据库提供程序, 配置 SQL Server、MySQL、PostgreSQL、Oracle 和 SQLite 数据库,编写不同类型数据库的连接字符串,多个 DbContext 上下文使用不同类型的数据库,上下文数据库迁移。
基于通用仓储实现自定义仓储类,使用自定义仓储实现替换默认通用仓储,配置隐式扩展属性,自定义 EF Core 仓储基类,抽象 DbContext 上下文接口,替换默认仓储上下文实现,在 EF Core 仓储上执行异步操作,关于 MongoDB 仓储实现的异步操作,使用 IAsyncQueryableExecuter 制行异步操作。
关于 ABP 数据访问抽象与 EFCore 数据访问实现,安装相关模块包并添加模块依赖,创建实体和 DbContext 上下文,指定连接字符串名称,实体数据库表映射配置,分离迁移上下文,实现设计时上下文迁移工厂,将上下文注册到容器,迁移多个上下文数据库,配置通用仓储,使用仓储生成演示数据,在服务中使用泛型仓储实现 CRUD 增删改查相关操作。
支持多数据库访问提供程序,灵活的多租户模块化微服务,通过示例学习可扩展的数据库分库分表部署方案,不同模块使用独立数据库,不同的租户使用独立数据库,多个模块共享数据库,多个租户共享数据库,不同租户的不同模块分离数据库,使用特性标记连接字符串名称,配置各种连接字符串,分析 ABP 源码,学习基于多租户的连接字符串解析器。
使用租户管理扩模块在数据库中存储租户配置,租户数据表结构配置,租户数据库架构迁移,迁移租户演示数据,配置租户管理权限,使用可视化 UI 界面管理租户,租户连接字符串管理,主机级别的功能特征管理,基于租户的功能特征管理,分析 APB 租户管理模块项目源码,学习租户管理系统实现原理。
租户存储器用于从数据源获取租户配置,使用默认租户存储器选项配置租户信息,使用配置文件配置租户信息,分析 ABP 源代码,理解多租户机制架构设计,使用租户中间件拦截请求,使用多个租户解析器从请求中解析租户,当前租户设置与获取接口,租户数据过滤器的内部实现原理。
多重租赁技术是一种软件架构技术,用于创建基于云构建的 SaaS 应用程序,关于 ABP 中的多租户模块包,多租户相关设置,数据库架构,多租户数据隔离方案,多租户共享数据库,多租户独享数据库,多租户混合数据库,理解用户的主机级别与租户级别,获取当前访客的租户信息,切换当前租户,禁用多租户数据过滤器,内置的多个租户解析器,基于二级子域名的租户解析器,自定义租户解析器。
在数据库中存储功能特征值,安装功能特征管理相关模块包,使用 EF Core 存储功能特征值,配置数据表结构,迁移数据库架构,设置功能特征管理权限,使用 UI 界面管理功能特征值,基于 API 接口管理功能特征值,分析功能特征管理模块源码的实现,深入理解工作机制和实现原理。
功能特征管理可在运行时启用禁用更改应用程序的功能行为,安装功能特征模块包,定义功能特征相关配置,子功能特征,更改已有模块的定义值,使用 [RequiresFeature] 和 IFeatureChecker 接口检查功能特征,在客户端检查功能特征,租户值提供者,版本值提供者,默认值提供者,自定义值提供者,使用自定义值存储器,分析 ABP 源码,理解功能特征模块实现原理。
使用 EF Core 和 MongoDB 在数据库中存储设置信息,安装设置管理相关模块,使用 EF Core 存储设置数据,配置表结构,迁移数据库表,理解设置视图组件提供者,设置页面导航菜单分组与权限控制,分析 ABP 源码,深入理解设置系统的工作机制和实现原理。
理解 ABP 设置模块与配置系统,使用提供者模式定义系统设置,在提供者中更改现有的设置定义,使用设置提供者获取设置值,在客户端读取设置值,实现设置值提供程序,默认值提供程序,配置文件提供程序,全局值提供程序,租户值提供程序,用户值提供程序,设置存储接口,配置加密解密服务,解析设置模块实现原理。
使用贡献者模式为审计日志动态追加内容,获取当前审计日志范围,手动创建审计日志范围,使用审计日志存储扩展模块,将审计日志保存到数据库表中,审计日志数据表的配置与迁移,阅读并理解 ABP 源码,学习基于拦截器的审计日志实现原理与处理机制,学习审计日志存储扩展模块源码,理解使用 EF Core 和 MongoDB 在数据库中存储审计日志的实现原理。
审计日志与系统日志的区别,基于 ABP 快速构建增删改查演示服务,安装审计日志模块包,在管道中插入审计中间件,审计日志配置选项,保存实体属性变更日志,启用和禁用服务操作审计日志,启用和禁用实体变更审计日志,审计日志的保存机制,理解审计日志对象结构图。
ABP 框架没有实现任何日志基础设施,沿用 ASP.NET Core 日志系统,推荐使用 Serilog 记录系统日志,日志记录相关配置,在控制台和文件中记录日志,基于 HTTP 请求的日志记录,日志输出模板设置,使用 ABP 中提供的 Serilog 扩展模块,将租户信息、用户信息、客户端信息和请求跟踪编号动态追加到日志条目中。
集成 ABP 用户界面模块,客户端包管理,前端自动化构建,编写启动页面,前端库的捆绑与压缩,使用 TagHelper 标签,在启动页面上集成权限管理系统的界面,使用界面分配权限和撤回权限,权限管理系统的本地化与多语言实现,分析 ABP 源码,学习权限管理系统界面的设计原理。
权限名称常量化与静态嵌套类,权限提供者,权限主键,权限策略名称,安装权限管理模块,权限管理提供者策略配置,配置 DbContext 上下文和数据库迁移程序,生成权限演示数据,使用代码管理权限,使用 API 接口远程管理权限,实现权限管理提供者,分析 ABP 权限管理系统架构源码,理解权限管理系统内部处理机制与最佳实践。
使用授权服务检查权限,在前端 JavaScript 中判断权限,在开发和测试阶段绕过授权服务,模拟当前用户标识和声明信息,分析 ABP 源码理解授权模块工作机制,授权拦截器,授权方法调用,授权服务,授权策略提供者,授权处理器,授权计算器,权限定义管理者,权限检查器,权限值提供者管理器。
认证与授权机制的区别,基于数据注解的权限策略,基于用户角色和客户端的多维度授权方式,在权限定义提供者中定义权限,权限的层级结构,实现权限名称本地化,权限与多租户,禁用权限,扩展权限值提供者,自定义权限存储机制,实战演练并理解身份认证与权限系统的处理流程。
安装 ABP 分布式缓存模块包,使用微软 .NET Core 内置分布式缓存接口,使用 ABP 中的泛型分布式缓存接口,缓存项序列化,缓存键前缀约定,基于多租户的缓存项隔离与共享,全局缓存配置选项,使用 Redis 分布式缓存服务,安装 Redis 扩展模块,配置连接字符串,访问分布式缓存,分析 ABP 源码中关于分布式缓存的机制的实现方式。
数据注解验证的优缺点,在 ABP 中使用 FluentValidation 模块实现链式验证器,安装模块包,创建对象验证器,编写链式验证规则,使用 ABP 内置验证过滤器对模型进行验证,学习 ABP 框架源码,理解验证拦截器,拦截验证方法,对象验证器,对象验证提供者,数据注解与链式验证提供者内部实现原理。
关于 ABP 的验证模型机制,实现 IValidationEnabled 接口对服务方法进行自动验证,验证错误信息的本地化,基于数据注解验证 DTO 数据传输对象,实现 IValidatableObject 接口,使用 IObjectValidator 验证对象,实现自定义对象验证提供者,动态注解特性扩展,通过分析 ABP 源码理解验证机制的实现原理。
理解 ABP 异常的处理模型,自动异常封装处理机制,错误消息格式,错误代码,错误详细信息,验证错误,异常级别与日志记录,自定义异常日志记录逻辑,业务异常封装,异常消息本地化与多语言,封送用户友好的错误提示消息,自定义异常与 HTTP 状态码映射关系,分析 ABP 源码,理解异常处理过滤器,内置轻量级异常发布订阅机制。
多语言网站可以覆盖更广泛的受众,使用 ABP 提供的本地化模块,借助微软中间件可将网站本地化为不同国家的语言和文化,安装本地化模块包,创建多语言资源包,简化资源名称,继承其它资源,扩展现有资源,设置默认资源,在类中使用本地化资源文件,格式化参数,在 Razor 视图中使用本地化资源文件,在前端使用本地化资源文件。
理解 ABP 中的虚拟文件系统,安装虚拟文件模块库,将指定的文件嵌入到程序集,使用 glob 通配符嵌入文件,使用反汇编工具查看嵌入在程序集中的文件,将嵌入在程序集中的文件注册到虚拟文件系统,使用 ABP 虚拟文件系统,将虚拟文件系统与 ASP.NET Core 集成,使用 HTTP 协议访问虚拟文件系统中的静态资源,学习 ABP 源码,理解虚拟文件系统模块的实现原理。
Autofac 是 .NET Core 平台上最常用的依赖注入框架,相比 .NET Core 标准的依赖注入库,它提供更加高级的特性,动态代理,属性注入,拦截器,基于配置文件的依赖项,安装 Autofac 模块,配置模块依赖,替换依赖注入容器,关于横切关注点与拦截器,动态 AOP 与静态 AOP 的区别与实现,实战演练编写自己的动态拦截器,学习 ABP 源码,理解验证拦截器,授权拦截器,工作单元拦截器,审计日志拦截器。
关于 ABP 中的依赖注入系统,在不同的模块中向容器添加依赖项,约定大于配置的原则,依赖注入默认约定,依赖项的生命周期,禁用默认约定,手动注册相关服务,依赖注入接口约定,依赖注入 Attribute 特性约定,多种注入方式混合使用,构造函数注入,属性注入,使用解析服务注入,依赖注册通知,分析 ABP 源码,学习依赖注入约定的实现。
ABP 框架中的配置系统与 ASP.NET Core 完全兼容,基于键值存储的配置系统,从配置文件中读取配置信息,关于选项配置模式,自定义配置选项,在容器中注入配置,从容器中解析配置,ABP 框架提供的预配置机制允许在容器初始化之前配置选项模式,在当前模块容器配置过程中解析其它模块提供的预配置选项。
扩展属性是用于存储实体额外数据但不用更改实体的一种扩展方式,创建或删除实体的扩展属性,设置实体的隐藏扩展属性,将多个实体类型映射到相同的数据库表并实现数据表共享,创建数据库同步共享表,追踪实体对象变更,在单体应用中订阅领域事件通知,基于分布式微服务的事件总线订阅,分析 ABP 模块源码,理解扩展属性的实现方式和事件总线机制。
ABP 框架的设计旨在使用可复用的模块构建应用程序系统,复用模块提供包引用和源码包含两种方式,前者整洁干净,升级简单,只包含自己的代码,后者提供源码级别的灵活修改,可分离模块解决方案,使用 ABP 提供的自动化构建脚本编译项目,搭建私有的 NuGet 包仓库服务器,使用 ABP 提供的脚本打包项目,将完成的打包自动发布到私有仓库,在解决方案中安装来自私有仓库的包。
创建 Angular 项目基架,定义领域实体,将实体添加到 DbContext 上下文,配置实体,数据库变更迁移,实现演示数据生成接口,多语言资源包,定义 DTO 数据传输对象,领域实体与 DTO自动映射配置 ,编写并实现应用程序服务接口,修改 Angular 请求地址,实现权限定义提供者接口,定义系统操作权限,基于角色的授权机制,使用 NPM 命令还原前端模块包,编译并运行 Angular 单页应用。
理解 ABP 中的测试体系结构,使用 xUnit 框架驱动测试,使用 Shouldly 链式断言库,基于 Mock 的 NSubstitute 开源模拟库,实战演练,实现演示数据生成器,编写单元测试和集成测试,基于 Substitute 类模拟接口实现,基于 TestServer 在内存进程级别进行 UI 界面测试,使用 AngleSharp 开源库解析网页 DOM 结构。
示例代码与依赖包还原,在 ABP 中使用 NPM 包管理器还原前端包,使用 Gulp 任务进行前端自动化构建,实战演练本地化与多国语言切换,定制菜单项,实现异步列表展示,排序与分页,创建功能,编辑功能,删除功能,前后端自动验证,实现品牌提供接口定制个性化站点内容。
使用命令行创建基架,在领域层添加实体和聚合根,在领域共享层添加枚举,将实体添加到 DbContext 上下文,配置实体的属性字段映射,添加新的迁移脚本并同步数据库,创建 DTO 对象并配置映射关系,创建应用层服务接口与实现,运行 OpenApi 帮助文档,使用动态生成的客户端代理脚本请求 API 接口,使用 C# 客户端代理调用 API 接口。
细说 ABP 命令行工具,理解项目模板,指定 UI 框架,移动端开发支持,选择数据库提供程序,分离 Web 项目和 API 项目,单独发布 IdentityServer 服务,模块分层与单体部署,将模块部署到不同的主机管道,容器化 ABP 模块并实现微服务架构,构建运行 Angular 单页项目,构建运行 React Native 移动应用,使用官方向导工具创建分层架构。
安装并更新 ABP 提供的 CLI 命令行工具,关于 ABP 命令与参数,使用 DDD 分层架构模板创建项目,指定模板,指定 UI 框架,选择数据库提供程序,将 API 接口与 IdentityServer 服务分离部署,多个项目模块共享请求管道,细说 DDD 项目分层结构,单元测试与集成测试项目结构说明,使用迁移工具创建数据库,启动并运行基架项目。
创建 ASP.NET Core 空项目,使用最少的依赖项构建请求管道,安装 ABP 框架提供的 MVC 模块包,用多个 ABP 模块构建不同的站点,在模块中配置依赖注入容器和请求中间件,在 Startup 启动类中配置 ABP 应用程序引擎,初始化 ABP 应用程序环境,使用 MVC 控制器处理请求,配置模块依赖关系,分析 ABP 源码,理解内部请求处理机制。
使用最少的依赖关系创建新项目并安装 ABP 核心包,创建首个 ABP 模块,初始化 ABP 应用程序引擎,加载启动模块,编写 HelloWorld 服务,使用依赖容器注入服务,基于约定的依赖注入方式,分析 ABP 源码,理解模块接口与基类层次,模块的声明周期,应用程序工厂与模块容器,模块管理器与加载器,程序集探测器与模块类型查询器。
关于 ASP.NET Boilerplate 与 ASP.NET Zero 的区别,全新的 ABP Framework 框架专注于 ASP.NET Core 平台应用程序开发,支持分布式微服务,提供 CLI 命令行,模块化,多租户,标签助手,认证与授权,横切关注点,捆绑与缩小,虚拟文件系统,多主题,后台任务,基于 DDD 设计,自动生成 API 接口,动态客户端代理,分布式事件总线,测试集成,审计日志,对象映射,电子邮件短信发送,多语言,面向方面的编程,约定式依赖注入。