using System; using Hncore.Infrastructure.Autofac; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; namespace Hncore.Infrastructure.WebApi { /// /// 服务集合对象(可以理解为内置的依赖注入容器)功能扩展类 /// /// public static class ServiceCollectionExtend { /// /// 通用初始化方法(被各个微服务项目所引用) /// /// 服务集合对象 /// 配置信息对象 /// .net core兼容版本 /// 服务自定义选项对象 /// 服务提供者对象 /// public static IServiceProvider Init(this IServiceCollection services, IConfiguration configuration, CompatibilityVersion version, ServiceOption serviceOption = null) { //启用选项配置服务 services.AddOptions(); //将配置信息对象以单例模式添加到服务集合中 services.AddSingleton(configuration); // services.AddCors(); var mvcbuilder = services .AddMvc(options => { options.EnableEndpointRouting = false; //关闭终端点路由 if (serviceOption != null && serviceOption.UseGlobalManageAuthFilter) { //如果配置并传递了自定义选项中的全局授权过滤器,就将全局授权过滤器添加到MVC全局过滤器链中让其生效 options.Filters.Add(new ManageAuthAttribute()); GlobalData.UseGlobalManageAuthFilter = true; } else { GlobalData.UseGlobalManageAuthFilter = false; } }) .SetCompatibilityVersion(version) //设置.net core兼容版本号 .AddJsonOptions(options => { //使用NewtonsoftJson插件,替换掉系统默认提供的JSON插件 options.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver(); //定义日期格式化策略 options.SerializerSettings.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat; options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local; //定义循环引用处理策略(就是要序列化的对象类A中引用了B,B引用了C……转了一圈儿之后又直接或间接引用回了A,就称为循环引用) options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; //序列化或反序列化时,可接受的日期时间字符串格式 options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; if (serviceOption != null && serviceOption.IgnoreJsonNullValue) { //如果配置并传递了自定义选项中的忽略空值选项,就在操作JSON时忽略掉空值数据 //忽略掉空值的意思就是如果对象中的某个属性值为null,它将不会出现在最终序列化后的JSON字符串中 options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; } }); services.AddApiVersioning(option => { //设置API版本信息 option.ReportApiVersions = true; //在向客户端响应的响应头中显示受支持的API版本信息 option.AssumeDefaultVersionWhenUnspecified = true; //如果客户端未提供并指定要调用的API版本,就以下方的默认版本为准 option.DefaultApiVersion = new ApiVersion(1, 0); //默认版本号 }); //启用HTTP请求上下文访问器(用来访问类似传统MVC中的那个HttpContext对象) services.AddHttpContextAccessor(); //构建并返回服务提供对象(在Build方法中主要用Autofac插件替换掉了默认的依赖注入插件,并做一些自动扫描配置) return new MvcAutoRegister().Build(services, mvcbuilder); } } /// /// 服务自定义配置类(承载一些自定义配置) /// /// public class ServiceOption { /// /// 是否启用全局授权过滤器(默认关闭) /// public bool UseGlobalManageAuthFilter { get; set; } = false; /// /// 是否在生成的JSON字符串中忽略掉为null的属性或字段(默认为false,意思就是就算字段为null也会出现在最终序列化后的JSON字符串中) /// public bool IgnoreJsonNullValue { get; set; } = false; } }