You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:03:32