NetCore Swagger 配置一個控制器兩個或多個分組(二)
/// <summary>
/// 系統(tǒng)模塊枚舉注釋
/// </summary>
public class GroupInfoAttribute : Attribute
{
public string Title { get; set; }
public string Version { get; set; }
public string Description { get; set; }
}
/// <summary>
/// 系統(tǒng)分組枚舉值
/// </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>
/// 系統(tǒng)分組特性
/// </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)]
參考網(wǎng)址:https://blog.51cto.com/u_15127592/2803541

浙公網(wǎng)安備 33010602011771號