NSwag CodeGenerator自定义客户端类名 移除路由连字符转换的下划线
解决方案
你可以通过以下两种方式实现需求,可根据你的项目场景选择:
方案1:直接配置替换规则(适合路由数量少的场景)
你当前使用的MultipleClientsFromFirstTagAndOperationId生成模式会取接口的第一个标签作为控制器名称,只需在nswag.json的C#代码生成配置中添加tagNameReplacements节点,直接映射含连字符的标签名称即可,配置示例如下:
{ "codeGenerators": { "cSharp": { "className": "SomeAPI{controller}Client", "operationGenerationMode": "MultipleClientsFromFirstTagAndOperationId", // 新增标签名替换规则 "tagNameReplacements": { "my-route": "MyRoute", "other-business-route": "OtherBusinessRoute" }, // 其余原有配置保持不变 "namespace": "YourNamespace", "output": "./Clients/GeneratedClient.cs" } } }
配置完成后重新生成,就能得到SomeAPIMyRouteClient格式的类名。
方案2:自定义控制器名称生成器(适合路由数量多、需要批量处理的场景)
如果含连字符的路由数量较多,逐一配置替换规则效率太低,可以自定义控制器名称生成逻辑,自动把所有连字符转换为驼峰格式:
- 新建一个类库项目,引用
NSwag.CodeGeneration.CSharpNuGet包,添加如下代码:
using NSwag.CodeGeneration.CSharp; using System.Text.RegularExpressions; public class HyphenRemovedControllerNameGenerator : CSharpControllerNameGenerator { public override string Generate(string controllerName) { // 匹配连字符后的第一个字符,转大写后去掉连字符 var processedName = Regex.Replace(controllerName, @"-(\w)", match => match.Groups[1].Value.ToUpper()); return base.Generate(processedName); } }
- 编译类库得到dll文件,在
nswag.json中指定使用你的自定义生成器:
{ "codeGenerators": { "cSharp": { "className": "SomeAPI{controller}Client", "operationGenerationMode": "MultipleClientsFromFirstTagAndOperationId", // 配置自定义生成器,格式为【类名, 类库程序集名称】 "controllerNameGeneratorType": "HyphenRemovedControllerNameGenerator, YourCustomGeneratorLib", // 其余原有配置保持不变 } } }
- 若使用NSwag.MSBuild生成,需确保自定义类库的dll路径在MSBuild的程序集搜索范围内,或者填写生成器类型的完整绝对路径。
内容的提问来源于stack exchange,提问作者abc
相关产品推荐
相关产品推荐

