如何用NSwag为每个API控制器生成独立Angular Service文件并从程序集生成代码?
没问题,这两个需求NSwag都能完美支持,我给你一步步讲怎么实现:
1. 为每个API控制器生成独立的
service.ts文件 默认情况下,GenerateFile()会把所有控制器的服务打包进单个文件,但只要我们按控制器分组过滤操作,就能生成独立的文件。核心思路是先把Swagger文档里的操作按控制器分组,再为每组单独生成代码:
实现步骤
- 第一步:按控制器分组操作
通常Swagger文档里的每个API操作会带有Tag(对应你的控制器名称,前提是API项目里的控制器用了[ApiController],且Swagger配置默认按控制器生成Tag)。我们可以通过Tag来分组;如果Tag不对应控制器名,也可以从API路径里提取控制器名称。 - 第二步:为每个控制器单独生成代码
用FilterClientOperationsProcessor过滤出当前控制器的操作,再生成代码并写入独立文件。
代码示例
string sUrl = "http://localhost:7325/swagger/v1/swagger.json"; var document = SwaggerDocument.FromUrlAsync(sUrl).Result; // 按Swagger Tag分组操作(Tag对应控制器名) var controllerGroups = document.Operations .GroupBy(op => op.Operation.Tags.FirstOrDefault() ?? "Unknown") .Where(g => !string.IsNullOrEmpty(g.Key)); foreach (var group in controllerGroups) { var controllerName = group.Key; var settings = new SwaggerToTypeScriptClientGeneratorSettings { ClassName = $"{controllerName}Service", Template = TypeScriptTemplate.Angular, InjectionTokenType = InjectionTokenType.InjectionToken, HttpClass = HttpClass.HttpClient, GenerateDtoTypes = true, BaseUrlTokenName = "API_BASE_URL", // 只保留当前控制器的操作 OperationProcessors = { new FilterClientOperationsProcessor(new[] { controllerName }, OperationProcessorFilterMode.Tags) } }; var generator = new SwaggerToTypeScriptClientGenerator(document, settings); var code = generator.GenerateFile(); // 写入独立文件,比如 product.service.ts File.WriteAllText(Path.Combine("你的输出路径", $"{controllerName.ToLower()}.service.ts"), code); }
如果你的Swagger Tag和控制器名不匹配,可以用正则从路径提取控制器名,比如路径是/api/Product/{id}:
var controllerGroups = document.Operations .GroupBy(op => { var match = Regex.Match(op.Path, @"^/api/([^/]+)/"); return match.Success ? match.Groups[1].Value : "Unknown"; }) .Where(g => !string.IsNullOrEmpty(g.Key));
2. 直接从程序集生成代码(无需Swagger JSON)
完全可以像NSwagStudio那样直接从.NET程序集生成代码,不用先导出Swagger JSON。核心是用AspNetCoreOpenApiDocumentGenerator直接从API程序集生成Swagger文档,再基于这个文档生成TypeScript代码。
代码示例
// 加载你的API程序集(如果和生成代码的项目在同一解决方案,直接用typeof获取更方便) var apiAssembly = Assembly.LoadFrom("YourApiProject.dll"); // 替代方案:如果已引用API项目,用 typeof(你的控制器类).Assembly // 配置Swagger文档生成设置 var swaggerSettings = new AspNetCoreOpenApiDocumentGeneratorSettings { Title = "你的API名称", Version = "v1", // 可选:添加XML注释路径,让生成的代码带注释 // XmlDocPaths.Add("YourApiProject.xml"); }; // 从程序集生成Swagger文档 var swaggerGenerator = new AspNetCoreOpenApiDocumentGenerator(swaggerSettings); var document = swaggerGenerator.GenerateAsync(new[] { apiAssembly }).Result; // 接下来就是你熟悉的TypeScript代码生成逻辑 var tsSettings = new SwaggerToTypeScriptClientGeneratorSettings { ClassName = "{controller}Service", Template = TypeScriptTemplate.Angular, InjectionTokenType = InjectionTokenType.InjectionToken, HttpClass = HttpClass.HttpClient, GenerateDtoTypes = true, BaseUrlTokenName = "API_BASE_URL", }; var tsGenerator = new SwaggerToTypeScriptClientGenerator(document, tsSettings); // 如果需要拆分文件,就用第一个问题的分组逻辑生成多个文件 // 或者生成单个文件:var code = tsGenerator.GenerateFile();
内容的提问来源于stack exchange,提问作者pinale
相关产品推荐
相关产品推荐

