如何为嵌入ASP.NET MVC的React组件自动生成TypeScript客户端?
方案一:改造MVC控制器兼容NSwag的OpenAPI生成
NSwag核心依赖OpenAPI规范,只需让MVC控制器能被Swagger识别并生成规范,就能复用现有NSwag工作流:
给MVC控制器添加API标识:
为现有MVC控制器添加[ApiController]和路由属性,让Swashbuckle(Swagger生成工具)能扫描到这些接口:[ApiController] [Route("api/foo")] public class FooController : Controller { [HttpGet("getfoo")] [ProducesResponseType(typeof(FooDto), StatusCodes.Status200OK)] public async Task<IActionResult> GetFoo(int fooId) { // 原有逻辑 var foo = new FooDto { /* ... */ }; return Json(foo); } }[ProducesResponseType]用于明确返回的DTO类型,确保Swagger能正确解析。配置Swashbuckle生成OpenAPI文档:
在MVC项目中安装Swashbuckle.AspNetCoreNuGet包,然后在Program.cs(或Startup.cs)中配置服务和中间件:// 添加Swagger服务 builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "MVC API", Version = "v1" }); // 包含DTO所在程序集的注释(可选,生成更详细的文档) var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); c.IncludeXmlComments(xmlPath); }); // 启用Swagger中间件 app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "MVC API V1"); });用NSwag生成TypeScript客户端:
复用现有WebAPI项目的NSwag配置,指向MVC项目生成的Swagger JSON地址(如http://localhost:xxxx/swagger/v1/swagger.json),即可自动生成包含DTO类型、请求方法的TS客户端,完全替代手动编写的代码。
方案二:直接从C# DTO生成TypeScript类型
如果不想修改MVC控制器结构,可以直接针对DTO类生成TS代码:
使用NSwag命令行工具:
直接指向包含DTO的MVC程序集,生成TS类型和客户端代码:nswag typecript /assembly:YourMvcProject.dll /output:MvcClient.ts /controllerNamePattern:*Controller该命令会从DLL中提取控制器和DTO信息,生成与手动编写结构一致的TS类(包含构造函数、类型映射,比如自动处理
DateTime转Date)。使用TypeWriter VS扩展:
安装TypeWriter扩展后,编写自定义模板来匹配TS类需求。例如以下模板可以生成带构造函数的接口和类:$Classes(c => c.Name.EndsWith("Dto"))[ export interface I$Name { $Properties[ $name: $Type; ] } export class $Name implements I$Name { $Properties[ $name!: $Type; ] constructor(data?: I$Name) { if (data) { $Properties[ this.$name = data["$name"]; ] } } } ]模板可自定义处理特殊类型(如
DateTime转Date,嵌套DTO实例化),保存模板后会自动同步C# DTO的修改到TS代码。
方案三:自动化JSON Schema生成流程
如果之前尝试过生成JSON Schema,可将该流程自动化:
- 编写脚本生成DTO的JSON Schema:
使用Newtonsoft.Json.Schema库编写控制台程序或PowerShell脚本,遍历DTO类生成Schema并保存到指定目录:var generator = new JSchemaGenerator(); var schema = generator.Generate(typeof(FooDto)); File.WriteAllText("FooDto.schema.json", schema.ToString()); - 集成到构建流程:
在MVC项目的构建事件中添加该脚本的执行命令,确保每次构建后Schema自动更新。 - 用NSwag基于Schema生成TS代码:
配置NSwag命令行或NSwagStudio项目,指向生成的Schema文件,自动生成对应的TS类型,实现全流程自动化。
关键注意事项
- 确保C# DTO的命名规范与TS兼容(如使用
[JsonPropertyName]属性调整序列化后的字段名,避免大小写问题)。 - 对于复杂类型(如嵌套DTO、枚举),上述工具均能自动处理映射,无需手动编写转换逻辑。
内容的提问来源于stack exchange,提问作者user8607541

