.Net Core的SwaggerUI接口分类+固定路由

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

image

 话不多说,开干,首先定义一个接口的业务类型枚举 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 站点的业务接口清晰可见,方便筛选和维护

 

 

 

  

posted @ 2025-09-01 16:26  郎中令  阅读(7)  评论(0)    收藏  举报