如何在基于Swagger生成UWP客户端代理时复用已有程序集类?
解决VS生成REST API客户端时重复生成共享类的问题
嘿,我太懂这种重复生成类的糟心了——明明手里已经有维护好的共享类库,结果工具还非要再生成一套一模一样的,不仅冗余还容易搞出命名冲突!别着急,咱们来一步步搞定它:
方法1:生成时直接配置重用共享类(最推荐)
其实在VS的REST API客户端生成向导里,就藏着重用已有类型的选项,只是很多人没注意到:
- 当你走到输入Swagger端点后的「下一步」,找到高级选项按钮点进去。
- 在弹出的窗口里,找到「重用类型」区域,点击「添加」。
- 选择你的共享类库项目,然后指定要重用的命名空间(可以选整个命名空间,也可以选特定类)。
- 还可以勾选「仅生成引用的类型」,这样工具只会生成那些共享库中没有、但API调用必须的类型,彻底减少冗余。
完成这些设置后再生成代码,工具就会自动引用你共享库中的类,而不是重新生成啦!
方法2:修改生成后的配置文件微调
如果已经生成了代码,也不用删了重来,直接修改生成的配置文件就行:
- 你的项目里会多出一个类似
YourApiName.openapi.config或者YourApiName.swagger.config的文件。 - 打开它,找到
<SharedTypes>节点(如果没有就自己加),配置你的共享类库信息:<SharedTypes> <SharedType Assembly="YourSharedClassLibrary" Namespace="Your.Shared.Namespace" /> </SharedTypes> - 再把
<GenerateModels>节点的值改成false,这样就完全不会生成模型类了,全部用共享库的。
方法3:处理个别命名冲突
如果还是有少数类出现冲突,试试这两个小技巧:
- 在共享类上添加
[DataContract(Name = "ExactModelNameFromSwagger")](如果用的是DataContract序列化),或者[JsonPropertyName("ExactModelNameFromSwagger")](System.Text.Json的话),让类名和Swagger里的模型名称完全匹配,工具就会自动识别并重用。 - 或者在配置文件里用
<TypeRenames>节点,给生成的类重命名,避开冲突:<TypeRenames> <Rename OldName="ConflictingModel" NewName="GeneratedConflictingModel" /> </TypeRenames>
方法4:换用更灵活的NSwag工具
如果VS自带的工具不够灵活,推荐试试NSwag——这是一款专门处理Swagger/OpenAPI的代码生成工具,对类型重用的支持更精细:
- 可以安装NSwag的VS扩展,或者用CLI工具。
- 编写一个
nswag.json配置文件,在CSharp生成器设置里添加"reuseTypesFromAssemblies",指定你的共享类库路径,再设置"reuseTypes"为true。 - 运行生成命令,就能完全控制哪些类生成、哪些重用,自由度拉满。
内容的提问来源于stack exchange,提问作者Phil Wright
相关产品推荐
相关产品推荐

