[英]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, List1 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.