2017-09-04 2 views
2

ich eine polymorphe Modell haben:C# Wie polymorphe Modelle zu handhaben mit NSwag

public class CreateOrderRequest 
{ 
    public List<CreateOrderItem> OrderItems { get; set; } 
} 

/// <summary> 
/// Identifies a new item within an order 
/// </summary>  
[JsonConverter(typeof(CreateOrderLineJsonConvertor))] 
[KnownType("GetKnownTypes")] 
public class CreateOrderItem 
{ 
    public string OrderContext { get; set; } 
    public string OrderItemType { get; set; } 

    public static Type[] GetKnownTypes() 
    { 
     return new[] 
     { 
      typeof(OrderItemType1), typeof(OrderItemType2) 
     }; 
    } 
} 

public class OrderItemType1: CreateOrderItem 
{ 
    public string Type1Prop {get;set;} 
} 

public class OrderItemType2: CreateOrderItem 
{ 
    public string Type2Prop {get;set;} 
} 

Mit NSwag (NSwag.AspNetCore) entsprechend der Dokumentation, ich dies genug, um zu erwarten, so dass die Dokumentation angegeben/enthalten die Reihenfolge Artikeltypen? Aber nein ...

enter image description here

habe ich völlig verfehlt den Punkt, was NSwag erfordert? Ich habe die OrderItemType-Eigenschaft. Muss ich einen Diskriminator involvieren? Wo ist das dokumentiert?

TIA

Antwort

1

Sie benötigen

[JsonConverter(typeof(JsonInheritanceConverter), "discriminator")] 

auf der Basisklasse, so dass der Unterscheider hinzugefügt wird.

Siehe https://github.com/RSuter/NJsonSchema/wiki/Inheritance

+1

Danke Rico. Möglicherweise dumme Frage. Dies ist eine AspNet-Core-Web-API-Anwendung. Liest ich das verknüpfte Dokument korrekt, dass das Attribut korrektes Swagger-Verhalten und Deserialisierung in generierten Clients ermöglicht ... aber ich kann das vorhandene Basisklassenattribut nicht entfernen, das für das Deserialisieren von Anforderungen durch den Server erforderlich ist? (Sry, kann nicht von meinem aktuellen Standort aus testen) – 6footunder

+1

NSwag (oder NJS) sucht nach diesem Konverter (der Name) und nur wenn es verfügbar ist das richtige Schema generiert. Zusätzlich fügt der Konverter dem json die discriminator Eigenschaft hinzu, so dass die Deserialisierung korrekt funktioniert ... –

+0

Und übrigens: Der Served Swagger 2.x unterstützt keine Diskriminatoren, vielleicht muss man eine eigene neuere Version oder Redoc verwenden –

Verwandte Themen