Services.AddSwaggerGen(s => { //堆代码 duidaima.com //多版本 typeof(SwaggerVersion).GetEnumNames().ToList().ForEach(v => { s.SwaggerDoc(v, new Microsoft.OpenApi.Models.OpenApiInfo { Version = v, Description = $"{v} API", Title = v, }); //添加注释 var basePath=AppDomain.CurrentDomain.BaseDirectory; var xmlPath = Path.Combine(basePath, "FastEasy.Readme.xml"); s.IncludeXmlComments(xmlPath,true); }); });如果不需要切换版本,那就关注添加注释下面三行代码就好,获取注释文档的路径,然后添加到swagger中。接下来就是多版本切换,上面的代码已经是了,需要在意的地方是typeof里的SwaggerVersion。这是创建的一个枚举,然后在枚举中按需添加不同的版本切换,例如
public enum SwaggerVersion { FastEasy = 1, OpenAPI = 2 }如果要使用多版本,中间件管道里也要改一下
app.UseSwagger(); app.UseSwaggerUI(s => { typeof(SwaggerVersion).GetEnumNames().ToList().ForEach(v => { s.SwaggerEndpoint($"swagger/{v}/swagger.json", $"{v}"); s.RoutePrefix = string.Empty; }); });到这里就已经完成90%了。最后一步就是给不同的方法或者控制器添加[ApiExplorerSettings(GroupName = "OpenAPI")]
[HttpGet("MUL")] [ApiExplorerSettings(GroupName = "OpenAPI")] public int MUL(int i, int j) { return test.MUL(i, j); }原本是加减乘除4个接口,现在就是FastEasy下两个,OpenAPI下两个(只是测试,跟名称毫无关系)
现在完成了99%了。如果像我这种小公司,没有版本的区别,无非就是为了看着方便,因为功能模块去区分开来。就像现在,查看文档的时候可以根据分类找到相对应的接口,不至于一眼乱糟糟的。
public class SwaagerRouteAttribute : RouteAttribute, IApiDescriptionGroupNameProvider { /// <summary> /// 默认的路由配置 /// </summary> /// <param name="actionName"></param> public SwaagerRouteAttribute(string actionName) : base(actionName) { } /// <summary> /// 分组名称,控制不同版本:等同于配置ApiExplorerSettings(GroupName ="FastEasy") /// </summary> public string? GroupName { get; set; } /// <summary> /// 自定义的路由配置 /// </summary> /// <param name="version"></param> /// <param name="actionName"></param> public SwaagerRouteAttribute(SwaggerVersion version, string actionName = "[action]") : base($"/{version.ToString()}/[controller]/{actionName}") { GroupName = version.ToString(); } }现在!用自己封装的路由属性添加到方法上面(截图看的全)