繁体   English   中英

C# 带有 NSwag 的多态模型

[英]C# Polymorphic models with NSwag

在我的 Asp.Net Core v5 应用程序中,我们有以下模型

public class StorageRecordTypeMetadataBase
{
    public string PropertyName { get; set; }
    public bool Required { get; set; }
}

public class StringRecordTypeMetadata: StorageRecordTypeMetadataBase
{
    public string? ValidationRegex { get; set; }
}

public class NumericRecordTypeMetadata : StorageRecordTypeMetadataBase
{
    public int MinValue { get; set; }
    public int MaxValue { get; set; }
}

在我的应用程序Startup.cs中,我注册了 Swagger 和 NSwag 设置,如下所示:

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddSwaggerDocument();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseOpenApi();
        app.UseSwaggerUi3();
     }

}

为了支持多态性,我遵循了 NSwag 创建者编写的指南:NSwag 中 inheritance 指南,这是我的 model 看起来更新后的样子:

[JsonConverter(typeof(JsonInheritanceConverter), "discriminator")]
[KnownType(typeof(StringRecordTypeMetadata))]
[KnownType(typeof(NumericRecordTypeMetadata))]
public class StorageRecordTypeMetadataBase
{
    public string PropertyName { get; set; }
    public bool Required { get; set; }
}

一旦我运行该应用程序,swagger 就会失败,因为无法生成 swagger.json。 在调查该问题后,一旦我尝试手动导航到 /swagger/v1/swagger.json,就会看到以下错误消息

System.MissingMethodException:找不到方法:'System.String Namotion.Reflection.XmlDocsExtensions.GetXmlDocsSummary(System.Reflection.MemberInfo)'。 在 NSwag.Generation.Processors.OperationSummaryAndDescriptionProcessor.ProcessSummary(OperationProcessorContext context, List 1 attributes) at NSwag.Generation.Processors.OperationSummaryAndDescriptionProcessor.Process(OperationProcessorContext context) at NSwag.Generation.AspNetCore.AspNetCoreOpenApiDocumentGenerator.RunOperationProcessors(OpenApiDocument document, ApiDescription apiDescription, Type controllerType, MethodInfo methodInfo, OpenApiOperationDescription operationDescription, List 1 allOperations, OpenApiDocumentGenerator swaggerGenerator, OpenApiSchemaResolver schemaResolver) at NSwag.Generation.AspNetCore.AspNetCoreOpenApiDocumentGenerator.AddOperationDescriptionsToDocument(OpenApiDocument document, Type controllerType, List 1 operations, OpenApiDocumentGenerator swaggerGenerator, OpenApiSchemaResolver schemaResolver) at NSwag.Generation.AspNetCore.AspNetCoreOpenApiDocumentGenerator.GenerateForControllers(OpenApiDocument document, IGrouping 2[] apiGroups, OpenApiSchemaRe 求解器 schemaResolver) 在 NSwag.Generation.AspNetCore.AspNetCoreOpenApiDocumentGenerator.GenerateAsync(ApiDescriptionGroupCollection apiDescriptionGroups) 在 NSwag.Generation.AspNetCore.AspNetCoreOpenApiDocumentGenerator.GenerateAsync(Object serviceProvider) 在 NSwag.AspNetCore.OpenApiDocumentProvider.GenerateAsync(String documentName) 在 NSwag.AspNetCore.Middlewares。 OpenApiDocumentMiddleware.GenerateDocumentAsync(HttpContext context) at NSwag.AspNetCore.Middlewares.OpenApiDocumentMiddleware.GetDocumentAsync(HttpContext context) at NSwag.AspNetCore.Middlewares.OpenApiDocumentMiddleware.GetDocumentAsync(HttpContext context) at NSwag.AspNetCore.Middlewares.OpenApiDocumentMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)

我什至我自己都尝试包含引用的 package Namotion.Reflection ,但这也无济于事。 我在配置过程中是否遗漏了什么?

这应该在基础 model 中添加discriminator器字段,以便在我在前端(React)端生成模型时自动识别它。 我可以通过从 NSwag 移到 Swashbuckle 来实现这种行为,如下所示:

public void ConfigureServices(IServiceCollection services)
{
    ...
        services.AddSwaggerGen(c =>
       {
           c.UseAllOfForInheritance();
           c.SelectSubTypesUsing(baseType =>
           {
               return typeof(StorageRecordType).Assembly.GetTypes().Where(type => type.IsSubclassOf(baseType));
           });

           c.SelectDiscriminatorNameUsing((baseType) => "itemType");
           c.SelectDiscriminatorValueUsing((subType) => subType.Name);
       });
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseSwagger((SwaggerOptions c) => { });
        app.UseSwaggerUI();
     }

}

然而,这完全打破了我的 React 方面的 NSwag 生成过程。 所有控制器的方法都放在一个客户端中(而不是按 controller 名称分开),而且参数中所需的一些类似乎也消失了。

如何修复 NSwag 以便在我的 swagger.json 响应中获取鉴别器值?

好的,问题是,我使用的是旧版本的Nswag.AspNetCore 而不是版本13.10.8我升级到13.15.5 ,它与 package NJsonSchema v 10.6.6配合得很好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM