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
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)]