能否通过NSwag在Swagger UI中按程序集而非控制器分组API操作?
当然可以实现按程序集分组API的需求!NSwag提供了灵活的分组配置能力,你只需要在Swagger文档生成的配置里自定义分组规则就行,下面是具体的实现步骤:
方法一:直接使用程序集名称作为分组名
在配置NSwag的AddOpenApiDocument(或AddSwaggerDocument,取决于你的.NET版本)时,通过OperationGroupSelector委托指定分组逻辑:
builder.Services.AddOpenApiDocument(settings => { // 保留你原有的其他配置,比如标题、版本等 settings.Title = "My API"; settings.Version = "v1"; // 核心:设置分组选择器,按控制器所在程序集分组 settings.OperationGroupSelector = operation => { // 获取当前API对应的控制器类型 var controllerType = operation.ControllerType; // 返回程序集名称作为分组名,兜底用"Unknown Assembly" return controllerType?.Assembly.GetName().Name ?? "Unknown Assembly"; }; });
这段代码的逻辑很简单:每个API操作都会触发这个委托,我们通过operation.ControllerType拿到该API所属的控制器类型,再获取控制器所在的程序集名称,以此作为分组标识。这样同一程序集下的所有控制器API就会被自动归到同一个组里。
方法二:自定义友好的分组名称(可选)
如果你不想直接用程序集的原始名称(比如太长或者不够直观),可以给程序集添加自定义特性,然后读取特性值作为分组名:
- 先定义一个用于标记程序集分组名称的特性:
[AttributeUsage(AttributeTargets.Assembly)] public class SwaggerAssemblyGroupNameAttribute : Attribute { public string GroupName { get; } public SwaggerAssemblyGroupNameAttribute(string groupName) { GroupName = groupName; } }
- 在你的目标程序集的
AssemblyInfo.cs(或直接在项目根文件中)添加特性标记:
[assembly: SwaggerAssemblyGroupNameAttribute("订单管理模块")]
- 修改NSwag的分组选择器,读取这个特性的值:
builder.Services.AddOpenApiDocument(settings => { // 其他配置... settings.OperationGroupSelector = operation => { var controllerType = operation.ControllerType; if (controllerType == null) return "未分组"; // 读取程序集上的自定义特性 var groupAttr = controllerType.Assembly.GetCustomAttribute<SwaggerAssemblyGroupNameAttribute>(); // 优先用自定义分组名,否则 fallback 到程序集名称 return groupAttr?.GroupName ?? controllerType.Assembly.GetName().Name; }; });
生效验证
配置完成后启动项目,打开Swagger UI,你会看到顶部的分组下拉框里显示的是各个程序集对应的分组名称,切换分组就能看到该程序集下的所有API了,完美替代默认的按控制器分组逻辑。
内容的提问来源于stack exchange,提问作者KNat
相关产品推荐
相关产品推荐

