.Net Core的SwaggerUI接口分类+固定路由
随着.Net Core 的逐步普及, 越来越多系统采用前后端分离的方式进行团队开发,随着业务的逐步积累,我们的接口更是五花八门,路由乱七八糟,不容易维护,今天研究一下Swagger,浅浅的记录一下路由+业务拆分,先贴一下最后的效果,可以看到,会根据不同的选择定义,展示对应的接口列表,并且路由都有固定的格式

话不多说,开干,首先定义一个接口的业务类型枚举 SwaggerVersion
public enum SwaggerVersion { Native, KiaserAPI, OtherAPI, }
然后创建 SwaagerAttribute 来上标记, 创建 SwaggerConvention 在启动时扫描标记 → 自动完成“分组 + 路由加版本前缀
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] public class SwagerAttribute : Attribute, IApiDescriptionGroupNameProvider { public string GroupName { get; } public SwagerAttribute(SwaggerVersion version) { GroupName = version.ToString(); } } public class SwaggerConvention : IControllerModelConvention { public void Apply(ControllerModel controller) { var attr = controller.ControllerType.GetCustomAttributes<SwagerAttribute>(false).FirstOrDefault(); if (attr == null) return; controller.ApiExplorer.GroupName = attr.GroupName; var prefix = $"/{attr.GroupName}/[controller]/[action]"; foreach (var selector in controller.Selectors) { selector.AttributeRouteModel = selector.AttributeRouteModel == null ? new AttributeRouteModel { Template = prefix } : AttributeRouteModel.CombineAttributeRouteModel(new AttributeRouteModel { Template = prefix }, selector.AttributeRouteModel); } } }
这些都是准备工作,处理完毕之后,我们在Startup.cs 类注册的时候,绑定即可(注释部分)
services.AddControllers(opt=> { //绑定路由自定义格式 opt.Conventions.Add(new SwaggerConvention()); }); services.AddSwaggerGen(c => { typeof(SwaggerVersion).GetEnumNames().ToList().ForEach(v => { var descriptionAttribute = (DescriptionAttribute)typeof(SwaggerVersion).GetField(v).GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault(); string description = descriptionAttribute?.Description ?? v; c.SwaggerDoc(v, new OpenApiInfo { Version = v, Description = $"{description} 文档", Title = description, }); }); //绑定业务的下拉分组依赖 c.DocInclusionPredicate((docName, apiDesc) => { var groupProvider = apiDesc.ActionDescriptor.EndpointMetadata .OfType<IApiDescriptionGroupNameProvider>() .FirstOrDefault(); return string.Equals(docName, groupProvider?.GroupName, StringComparison.OrdinalIgnoreCase); });
以上代码安全可靠,直接放心食用,简单加入条件之后,SwaggerUI 站点的业务接口清晰可见,方便筛选和维护
本文来自博客园,作者:郎中令,世人皆大笑,举手揶揄之,文未佳,却己创,转载请注明原文链接:https://www.cnblogs.com/Sientuo/p/19049009

浙公网安备 33010602011771号