5

我有一个 .NET 5.0 ASP.NET Core 项目,我正在使用Nswag它来生成一个 API 客户端。假设我有以下 API 模型:

public class GetFooListResponseModel
{
    public string Bar { get; set; }
}

我想要的是两件事。让我们从基本的开始。

  • 如何使生成的 API 客户端的模型名称与我的项目中的模型名称不同?例如,我希望调用生成的打字稿模型Foo而不是GetFooListResponseModel.
  • 我可以根据它生成的客户端使它们具有不同的名称吗?例如,对于我的 C# 客户端,我完全可以使用现有的模型名称,但需要更改打字稿。如果这是不可能的,那没什么大不了的,但这会很好。

非常感谢!

4

3 回答 3

4

您可以使用 SchemaNameGenerator 自定义模型名称。您可以参考shadowsheep 的回答。要生成全新的模型名称,您可以将 CustomeAttribute 与 SchemaNameGenerator 一起使用。

public class ClientModelAttribute : Attribute
{
    public string Name { get; set; }
    public ClientModelAttribute(string name)
    {
        Name = name;
    }
}

  internal class CustomSchemaNameGenerator : ISchemaNameGenerator
{
    public string Generate(Type type)
    {
        var attrs = type.GetCustomAttributes(typeof(ClientModelAttribute),true);

        foreach (var attr in attrs)
        {
            if(attr is ClientModelAttribute)
            {
                ClientModelAttribute clientModel = attr as ClientModelAttribute;
                return clientModel.Name;
            }
        }

        return type.FullName;
    }
}

具有 CustomAttribute 的模型类

[ClientModel("Foo")]
public class WeatherForecast
{
    public DateTime Date { get; set; }

    public int TemperatureC { get; set; }

    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);

    public string Summary { get; set; }
}

更新配置服务

services.AddSwaggerDocument(cfg => { cfg.SchemaNameGenerator = new CustomSchemaNameGenerator(); });

招摇.json

 "paths": {
"/WeatherForecast": {
  "get": {
    "tags": [
      "WeatherForecast"
    ],
    "operationId": "WeatherForecast_Get",
    "responses": {
      "200": {
        "x-nullable": false,
        "description": "",
        "schema": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/Foo"
          }
        }
      }
    }
  }
}
于 2021-10-18T12:43:45.450 回答
0

有时,最好的解决方案是最简单的。尝试创建一个窗口/消息,询问用户他们希望他们的模块名称是什么,一旦程序启动就会触发?

于 2021-10-19T20:26:46.953 回答
-1

您可以简单地创建一个名为“FooService”的可注入服务,用于使用 HTTP 请求与后端服务进行通信。指定从 API 返回的模型/类(您可以创建所需的任何名称)getFooListResponse()。不必命名必须与 相同GetFooListResponseModel,只要模型/类的属性及其数据类型相同即可。

foo.service.ts

@Injectable()
export class FooService 
{
  constructor(
  protected http: HttpClient
  ) {}

  getFooListResponse() {
    const endpointUrl = "myEndpointUrl";
    return this.http.get<Foo>(endpointUrl);
  }
}

foo.model.ts

export class Foo {
    public Bar: string;
}
于 2021-10-18T01:53:28.110 回答