NetCore Swagger 配置一个控制器两个或多个分组(二)

/// <summary>
/// 系统模块枚举注释
/// </summary>
public class GroupInfoAttribute : Attribute
{
    public string Title { get; set; }
    public string Version { get; set; }
    public string Description { get; set; }
}

/// <summary>
/// 系统分组枚举值
/// </summary>
public enum ApiGroupNames
{
    [GroupInfo(Title = "无分组", Description = "无分组接口", Version = "v1")]
    NoGroup,
    [GroupInfo(Title = "A", Description = "A相关接口", Version = "v1")]
    A,
    [GroupInfo(Title = "B", Description = "B相关接口", Version = "v1")]
    B,
    [GroupInfo(Title = "C", Description = "C相关接口", Version = "v1")]
    C,
}

/// <summary>
/// 系统分组特性
/// </summary>
public class ApiGroupAttribute : Attribute
{
    public ApiGroupAttribute(params ApiGroupNames[] name)
    {
        GroupName = name;
    }

    public ApiGroupNames[] GroupName { get; set; }
}

//配置swagger时

//遍历ApiGroupNames所有枚举值生成接口文档,Skip(1)是因为Enum第一个FieldInfo是内置的一个Int值
typeof(ApiGroupNames).GetFields().Skip(1).ToList().ForEach(f =>
{
//获取枚举值上的特性
var info = f.GetCustomAttributes(typeof(GroupInfoAttribute), false).OfType().FirstOrDefault();
m.SwaggerDoc(f.Name, new OpenApiInfo
{
Title = info?.Title,
Version = info?.Version,
Description = info?.Description
});
});

//判断接口归于哪个分组                    
m.DocInclusionPredicate((docName, apiDescription) =>
{
//反射拿到值 
var actionlist = apiDescription.ActionDescriptor.EndpointMetadata.Where(x => x is ApiGroupAttribute);
if (docName == "NoGroup")
{
if (actionlist.Count() == 0)
//当分组为NoGroup时,只要没加特性的都属于这个组
return string.IsNullOrEmpty(apiDescription.GroupName);
}
else
{
if (actionlist.Count() > 0)
{
//判断是否包含这个分组 
var actionfilter = actionlist.FirstOrDefault() as ApiGroupAttribute;
if (actionfilter != null)
return actionfilter.GroupName.Count(x => x.ToString() == docName) > 0;
else
return false;
}
}
return false;
});

//给控制器增加自定义属性,在A分组和B分组都有接口信息
[ApiGroup(ApiGroupNames.A, ApiGroupNames.B)]

参考网址:https://blog.51cto.com/u_15127592/2803541

posted @ 2022-02-16 15:12  blsegirl  阅读(374)  评论(0编辑  收藏  举报