开源博客项目Blog的解决方案总共包括4个项目,其中App.Hosting项目包括所有的页面及控制器类,其它项目主要提供数据库访问、基础类型定义等。这四个项目的依赖关系如下图所示,本文主要分析App.Framwork项目的主要结构及主要文件的用途。
App.Framwork项目主要安装了以下Package包,用于自动依赖注入、缓存设置与操作、数据验证、日志记录及数据映射。
AspectCore.Extensions.Autofac
Autofac.Extensions.DependencyInjection
EasyCaching.Core
EasyCaching.CSRedis
EasyCaching.InMemory
EasyCaching.Interceptor.AspectCore
EasyCaching.Serialization.Json
EasyCaching.Serialization.MessagePack
FluentValidation.AspNetCore
log4net
Mapster
App.Framwork项目的顶层文件及文件夹如下图所示,下面逐一概述其大致用途。
Storage.cs。全局静态类,保存了所有的项目程序集(Assemblys),也能从中获取http请求上下文(Current)、配置文件的根节点(Configuration)、Autofac依赖注入静态服务(Container)等重要信息,同时提供GetService和GetScopeService获取指定服务。
DataValidation文件夹。保存数据验证相关的特性类、过滤器类的定义。其下级结构如下图所示,其中:
定义了IgnoreValidationAttribute类以支撑忽略数据验证的场景;
定义了DataValidationFilter类以处理客户端请求中的数据验证操作;
MvcBuilderExtensions类仅定义AddValidation函数,用于在程序启动时设置数据验证相关属性,同时枚举及注册所有继承自IValidator接口的组件,并在函数最后设置全局过滤器。
DependencyInjection文件夹。用于定义依赖注入相关的接口、扩展类的定义。其下级结构如下图所示,其中:
AutofacModule类用于检索并注册所有继承自IScopedDependency、ISingletonDependency、ITransientDependency接口的组件,同时注册所有控制器类;
ApplicationBuilderExtensions扩展类用于给Storage.Container属性赋值;
AspectCoreInterceptorAutofacExtensions扩展类用于注册EasyCaching缓存相关的类型;
ContainerBuilderExtensions类的AutoRegisterService函数支持基于Autofac注册以指定字符串结尾的类型(App.Hosting项目的program.cs文件中调用该函数注册所有service结尾的类);
AddAutoDependencyInjection扩展类定义了另一种类型自动注册方式(应该没有使用,没找到调用点)。
Encryption文件夹。包含MD5、Sha256两种摘要计算类。
Extensions文件夹。里面包含两个空类的定义,没有实质内容。
Generate文件夹。其下级结构如下图所示,其中Snowflakeid创建雪花ID,VerifyCode生成验证码文本及图片,Geetest文件夹中保存与极验相关的接口、类型、交互操作类。
Log文件夹。保存日志接口及基于log4net的日志实现类。
Mapper文件夹。其中的ServiceCollectionExtension类用于设置Mapster相关配置,并在App.Hosting项目的program.cs文件中调用。
Net文件夹。其中的Net类定义发送post、get请求的同步和异步函数,同时定义获取客户端/服务端IP、获取操作系统版本号、获取浏览器信等通用操作函数,该类为通用类,可直接用于其它网站项目。
Result文件夹。包含解决方案内所有函数中使用的操作结果类型枚举定义ResultType,同时定义解决方案内所有函数中都能使用的通用操作结果类UnifyResult和泛型类UnifyResult。
ValueType文件夹。其中的EnumExtensions扩展类的函数Description用于保存并返回指定枚举类的描述(获取枚举类型相关的DescriptionAttribute的值)。
参考文献:
[1]https://gitee.com/miss_you/Blog
[2]https://www.donet5.com/Home/Doc
[3]https://github.com/MapsterMapper/Mapster
[4]https://github.com/rivenfx/Mapster-docs