2.7 按照约定生成Api分组
1)自定义约定
将控制器特定约定进行分组,以下为命名空间尾缀进行Api分组处理,
/// <summary> /// 自定义ApiExplorGroup添加到控制器模型中 /// </summary> public class ApiExplorerGroupVersionConvention : IControllerModelConvention { public void Apply(ControllerModel controller) { string namespac = controller.ControllerType.Namespace; string groupname = namespac.Split(".").Last().ToLower(); controller.ApiExplorer.GroupName = groupname; } }
2)添加约束
Startup.cs中的服务注册函数中修改AddControllers函数配置,
public void ConfigureServices(IServiceCollection services) { .......... //添加自定义apiexplor.groupname控制器模型属性 services.AddControllers(configure => { configure.Conventions.Add(new ApiExplorerGroupVersionConvention()); }); }
3)修改命名空间
修改控制器WeatherForecastController与ValuesController的命名空间分别为v1和v2,
//WeatherForecastController.cs namespace swaggertestbase.Controllers.v1 { /// <summary> /// 天气预报服务 /// </summary> [ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { ....... } } //ValuesController.cs namespace swaggertestbase.Controllers.v2 { [ApiController] [Route("api/[controller]")] [ApiExplorerSettings(GroupName ="v2")] public class ValuesController : ControllerBase { ....... } }
运行效果中,会发现,切换到ggcy v2时,将不再包含天气预报相关控制器和api
2.8 自定义Action分组规则判定条件
1)引用依赖
Nuget引用Microsoft.AspNetCore.Mvc.Versioning 5.0.0
2)添加判定规则
修改服务注册中DocInclusionPredicate的ApiDescription.GroupName判定逻辑,实现依据version特性进行Api分组
public void ConfigureServices(IServiceCollection services) { services.AddSwaggerGen( options => { ........... #region 自定义DocInclusionPredicate判定规则 options.DocInclusionPredicate((docName, apiDesc) => { //判定当前执行是否为函数对象 if (!apiDesc.TryGetMethodInfo(out MethodInfo methodInfo)) return false; //获取函数对应的自定义特性ApiVersionAttribute对应的版本集合 var versions = methodInfo.GetCustomAttributes(true) .OfType<ApiVersionAttribute>() .SelectMany(x => x.Versions); //判定版本集合中是否与当前文档匹配 return versions.Any(x => $"v{x}" == docName); }); #endregion } ); ......... }
3)添加案例控制器
创建Api控制器DocInclusionController,设定Version特性
namespace swaggertestbase.Controllers { /// <summary> /// DocInclusion控制器 /// </summary> [Route("api/[controller]")] [ApiController] public class DocInclusionController : ControllerBase { /// <summary> /// 获取DocInclusion数据 /// </summary> /// <returns>查询结果</returns> /// <remarks> /// GET: /// api/DocInclusionController /// </remarks> [HttpGet] [ApiVersion("1")] public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } } }
运行效果:

