是否可在命令行版NSwag(nswag.exe)中注入自定义生成器
实现方案
完全可以实现,不需要单独构建部署自定义控制台应用,也能把自定义名称生成器注入NSwag命令行、接入MSBuild生成流程,具体操作如下:
核心逻辑
NSwag官方的命令行工具(nswag.exe)和MSBuild任务原生支持加载外部扩展程序集,不需要修改工具本身,只要把自定义生成逻辑编译成独立类库,让NSwag启动时加载即可,你现有的两个自定义生成器实现几乎不需要改代码就能复用。
操作步骤
- 整理自定义生成器为独立类库
把CustomTypeNameGenerator、TClientGenerator两个自定义实现从原有控制台项目中抽离,放到独立的类库项目中。类库建议使用和你当前NSwag版本兼容的目标框架(一般netstandard2.0即可),引用和你所用NSwag版本完全一致的NSwag.CodeGeneration.CSharp、NSwag.CoreNuGet包。注意两个生成器类必须标记为public,且提供无参构造函数,方便NSwag通过反射实例化。
顺带提一句,你原有配置里DateType = "System.DataTime"是笔误,正确写法是System.DateTime,迁移配置的时候记得修正。 - 配置NSwag加载自定义程序集
不管是用nswag.exe命令行还是NSwag.MSBuild任务,都可以在nswag.json配置文件的根节点添加extensionPaths配置项,填入你上一步编译出的自定义类库dll的文件路径,NSwag启动时会自动加载该路径下的程序集,识别你写的自定义生成器类型。 - 迁移原有生成配置到nswag.json
你原来在控制台代码里写的所有CSharpClientGeneratorSettings配置项,都可以一一对应到nswag.json的CSharp客户端生成节点下,其中两个生成器的配置不需要写实例化代码,直接填类型的完全限定名+程序集名即可,格式为命名空间.类名, 程序集名称,配置示例如下:{ "extensionPaths": ["你的自定义生成器类库dll的相对/绝对路径"], "codeGenerators": { "openApiToCSharpClient": { "className": "{controller}Client", "namespace": "你配置的客户端命名空间", "classStyle": "Inpc", "dateTimeType": "System.DateTime", "dateType": "System.DateTime", "typeNameGenerator": "你的自定义生成器命名空间.CustomTypeNameGenerator, 你的自定义生成器类库程序集名", "jsonLibrary": "SystemTextJson", "generateClientInterfaces": true, "generateClientClasses": true, "operationNameGenerator": "你的自定义生成器命名空间.TClientGenerator, 你的自定义生成器类库程序集名", "exceptionClass": "YadaYada.Library.Client.SwaggerException", "injectHttpClient": true, "serializeTypeInformation": true, "disposeHttpClient": true, "wrapDtoExceptions": false, "generateOptionalParameters": true, "exposeJsonSerializerSettings": false, "parameterArrayType": "System.Collections.Generic.IList", "responseArrayType": "System.Collections.Generic.IList", "generateExceptionClasses": false, "useBaseUrl": false, "generateDtoTypes": false, "additionalNamespaceUsages": ["你需要额外引入的命名空间列表"] } } } - 接入MSBuild流程
给需要触发代码生成的项目安装NSwag.MSBuildNuGet包,把配置好的nswag.json放到项目目录下,配置编译前触发的生成任务即可,后续项目正常编译的时候就会自动执行代码生成逻辑,不需要单独运行控制台程序。
注意事项
- 自定义生成器类库引用的所有NSwag相关NuGet包版本,必须和你使用的nswag.exe、NSwag.MSBuild包版本完全一致,否则会出现类型不匹配导致的反射加载失败问题。
- 如果你的自定义生成器内部有其他依赖,需要在无参构造函数中自行初始化,NSwag加载扩展时不会走依赖注入容器,无法自动注入依赖。
- 自定义生成器类不要用静态、抽象修饰,否则NSwag无法正常实例化。
内容的提问来源于stack exchange,提问作者Tim Bassett
相关产品推荐
相关产品推荐

