【问题标题】:NSwag namespace in model names模型名称中的 NSwag 命名空间
【发布时间】:2017-12-27 17:06:51
【问题描述】:

是否可以生成客户端代码,以便模型的类名具有完整的命名空间作为前缀?

这应该避免相同的类名冲突。

例子

com.foo.MyClass 

和

it.foo.MyClass

到目前为止,我得到的是MyClass 和MyClass2,这没什么意义。

最好有ComFooMyClass和ItFooMyClass,以防名称冲突。

【问题讨论】:

    标签: nswag


    【解决方案1】:

    让我更新 shadowsheep 对更新版本 NSwag 的回答:

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

    与:

    internal class CustomSchemaNameGenerator : ISchemaNameGenerator
    {
        public string Generate(Type type)
        {
            return type.FullName.Replace(".", "_");
        }
    }
    

    【讨论】:

      【解决方案2】:

      我找到了使用自定义 SchemaNameGenerator 而不是自定义 TypeNameGenerator(我没有包信息)的解决方案。

      internal class MySchemaNameGenerator : DefaultSchemaNameGenerator, ISchemaNameGenerator
      {
          public override string Generate(Type type)
          {
              string retValue = base.Generate(type);
              // Quite ugly but do fix the concept
              if (retValue.Equals("BaseClass"))
              {
                  retValue = type.FullName.Replace(".","_");
              }
              return retValue;
          }
      }
      

      始终通过设置进行设置:

       app.UseSwaggerUi(typeof(WebApiApplication).Assembly, new SwaggerUiSettings
                      {
                          SchemaNameGenerator = new MySchemaNameGenerator(),
                          ...
      

      这样我得到了更有意义的东西

      "/api/test/models/base": {
            "get": {
              "tags": [
                "Test"
              ],
              "operationId": "Test_Get2",
              "parameters": [],
              "responses": {
                "200": {
                  "description": "",
                  "schema": {
                    "$ref": "#/definitions/WebApi_Models_BaseClass"
                  },
                  "x-nullable": true
                }
              }
            }
          },
          "/api/test/models/extended": {
            "get": {
              "tags": [
                "Test"
              ],
              "operationId": "Test_Get3",
              "parameters": [],
              "responses": {
                "200": {
                  "description": "",
                  "schema": {
                    "$ref": "#/definitions/ExtendedClass"
                  },
                  "x-nullable": true
                }
              }
            }
          },
          "/api/test/modelli/base": {
            "get": {
              "tags": [
                "Test"
              ],
              "operationId": "Test_Get4",
              "parameters": [],
              "responses": {
                "200": {
                  "description": "",
                  "schema": {
                    "$ref": "#/definitions/WebApi_Modelli_BaseClass"
                  },
                  "x-nullable": true
                }
              }
            }
          },
      

      即使多态性的鉴别器属性需要基本名称“BaseClass”。

      【讨论】:

      • 这里我在两个不同的命名空间中有两个 BaseClass(我的问题是 MyClass):WebApi.Models 和 WebApi.Modelli
      【解决方案3】:

      通过 C# 使用 NSwag 时,您可以提供自己的 TypeNameGenerator(通过设置对象)来自定义生成类名的方式。

      【讨论】:

      • 我尝试使用 TypeNameGenerator = new MyTypeNameGenerator() 设置我的 TypeNameGenerator 但在生成时我只有这些参数:JsonSchema4 模式、字符串 typeNameHint、IEnumerable reservedTypeNames 以便我无法推断出正确的包信息我需要的信息。
      • 使用 c# OpenAPI 连接服务 1.2.2 版时是否可以(总是)在生成的客户端代码中使用完整的类型名称,如“com.foo.MyClass”或“it.foo.MyClass”。我面临与 OP 相同的问题,并且不愿意重命名某些类只是为了避免重命名为 MyClass2。更不用说重命名的类可能导致的所有混乱......
      【解决方案4】:

      生成完整的命名空间。您需要设置 API 以返回具有完整命名空间的 swagger

      services.AddSwaggerGen(c =>
      {
          ...  //any lines you aready have 
          c.CustomSchemaIds((type) => type.FullName); //show full namespace
      }
      

      您无法通过 NSwagStudio 生成客户端,您需要通过代码使用此解决方案 https://stackoverflow.com/a/45311657/1818723

      这里是通过自己的代码生成客户端的现成代码

      using NJsonSchema;
      using NSwag;
      using NSwag.CodeGeneration.CSharp;
      using NSwag.CodeGeneration.OperationNameGenerators;
      using System.Collections.Generic;
      using System.IO;
      using System.Net;
      using System.Threading.Tasks;
      
      ...
      
      public async Task<string> GetClientCode(string swaggerUrl, CSharpClientGeneratorSettings settings)
      {
          settings.OperationNameGenerator = new SingleClientFromOperationIdOperationNameGenerator();
          settings.CSharpGeneratorSettings.TypeNameGenerator = new MyTypeNameGenerator();
          var swagger = await GetAsync(swaggerUrl);
          var document = await OpenApiDocument.FromJsonAsync(swagger);
          var codeGen = new CSharpClientGenerator(document, settings);
      
          var code = codeGen.GenerateFile();
          return code;
      }
      
      public class MyTypeNameGenerator : ITypeNameGenerator
      {
          public string Generate(JsonSchema schema, string typeNameHint, IEnumerable<string> reservedTypeNames)
          {
              if (typeNameHint == null && schema.IsEnumeration && schema.Title != null)
                      return schema.Title; //for method argument when expected type is IEnumerable<Enum> (swagger definition must contain title - see last link) 
      
              return typeNameHint;   //this contains full namespace (assuming returned in swagger definition)
          }
      }
      
      private async Task<string> GetAsync(string uri)
      {
          HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
          request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
      
          using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync())
          using (Stream stream = response.GetResponseStream())
          using (StreamReader reader = new StreamReader(stream))
          {
              return await reader.ReadToEndAsync();
          }
      }
      

      这里是关于枚举标题

      https://github.com/RicoSuter/NSwag/issues/2103#issuecomment-853965927

      【讨论】:

        猜你喜欢
        • 2019-02-19
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 2012-06-19
        • 1970-01-01
        • 2012-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多