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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:54:21