如何让Refitter使用已有DTO?有无支持该需求的替代工具?
问题解答
1. Refitter 能否复用已有DTO?可以,正确配置方式如下
之前的命令缺少核心参数--use-existing-types,这是让Refitter优先选用已有类型而非自动生成的关键开关,完整的有效命令需包含以下配置:
- 启用已有类型复用:添加
--use-existing-types参数 - 指定DTO所在命名空间:保留
--additional-namespace "nuget.namespace.for.dtos" - 指定DTO所在程序集:添加
--assembly "YourDtoPackageName.dll"(若项目已引用该NuGet包,直接填写程序集名称即可,无需完整路径)
示例命令:
refitter swagger.json --skip-validation --use-existing-types --additional-namespace "nuget.namespace.for.dtos" --assembly "MyDtoNuGetPackage.dll"
额外注意事项
- 名称严格匹配:Swagger文档中定义的Schema名称必须和已有DTO的类名完全一致(含大小写),Refitter通过名称匹配实现类型复用
- 手动类型映射:若Swagger Schema名称和DTO类名不匹配,可通过
--type-mapping参数手动指定映射关系,示例:
--type-mapping "SwaggerResponseSchema:nuget.namespace.for.dtos.MyExistingDTO"
- 手动替换后报错的原因:你遇到的
Refit.ApiException(响应转换失败),大概率是已有DTO的属性结构和Swagger响应Schema不匹配:- 检查DTO的属性名、类型、可空性是否与Swagger定义完全一致
- 检查DTO的序列化配置(如
[JsonPropertyName]特性)是否和Swagger字段名匹配 - 确认接口定义中的
IInterface<MyExistingDTO>是否符合实际响应结构:若Swagger返回的是直接的MyExistingDTO而非包装类,接口应定义为Task<MyExistingDTO> SomethingToPOST([Body] MyPostDTO body);
2. 支持复用已有DTO的替代工具
NSwag
可直接生成Refit风格接口,在NSwagStudio或命令行中均可配置复用已有类型:
- 在UI工具中勾选「Use existing types」选项,指定DTO的命名空间和程序集
- 支持手动映射不匹配的类型,还能自定义生成代码的结构
OpenAPI Generator
官方OpenAPI代码生成工具,支持C# + Refit模板,通过以下参数实现类型复用:
--import-mappings:指定Swagger Schema到已有DTO的映射--skip-overwrite:避免覆盖已有类型的引用- 示例命令片段:
openapi-generator generate -i swagger.json -g csharp-refit --import-mappings SwaggerSchemaName=nuget.namespace.for.dtos.MyExistingDTO
AutoRest
老牌代码生成工具,支持生成类型安全的.NET客户端,通过配置文件(readme.md)指定已有类型的引用,适合复杂场景的类型复用配置。
内容的提问来源于stack exchange,提问作者user1911091
相关产品推荐
相关产品推荐

