2015-12-21 13 views
6

मेरे पास सी # में एएसपी.Net वेब एपीआई 5.2 प्रोजेक्ट है और स्वाशबकल के साथ प्रलेखन उत्पन्न करना है।मैं स्वाशबकल का उपयोग करके स्वैगर एपीआई दस्तावेज में उप-वर्ग कैसे शामिल करूं?

मेरे पास मॉडल है जिसमें पशु पशु श्रेणी और कुत्ते और बिल्ली वर्गों से पशु संपत्ति होने जैसी विरासत होती है।

स्वाशबकल केवल पशु वर्ग के लिए स्कीमा दिखाता है, इसलिए मैंने इस्केमाफिल्टर (जो भी वे सुझाव देते हैं) के साथ खेलने की कोशिश की लेकिन मैं इसे काम नहीं कर सका और मुझे एक उचित उदाहरण भी नहीं मिला।

कोई भी मदद कर सकता है?

+0

किसी भी भाग्य इस लगाना:

SwaggerDocsConfig configuration; ..... configuration.DocumentFilter<PolymorphismDocumentFilter<YourBaseClass>>(); configuration.SchemaFilter<PolymorphismSchemaFilter<YourBaseClass>>(); ..... public class PolymorphismSchemaFilter<T> : ISchemaFilter { private readonly Lazy<HashSet<Type>> derivedTypes = new Lazy<HashSet<Type>>(Init); private static HashSet<Type> Init() { var abstractType = typeof(T); var dTypes = abstractType.Assembly .GetTypes() .Where(x => abstractType != x && abstractType.IsAssignableFrom(x)); var result = new HashSet<Type>(); foreach (var item in dTypes) result.Add(item); return result; } public void Apply(Schema schema, SchemaRegistry schemaRegistry, Type type) { if (!derivedTypes.Value.Contains(type)) return; var clonedSchema = new Schema { properties = schema.properties, type = schema.type, required = schema.required }; //schemaRegistry.Definitions[typeof(T).Name]; does not work correctly in SwashBuckle var parentSchema = new Schema { @ref = "#/definitions/" + typeof(T).Name }; schema.allOf = new List<Schema> { parentSchema, clonedSchema }; //reset properties for they are included in allOf, should be null but code does not handle it schema.properties = new Dictionary<string, Schema>(); } } public class PolymorphismDocumentFilter<T> : IDocumentFilter { public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, System.Web.Http.Description.IApiExplorer apiExplorer) { RegisterSubClasses(schemaRegistry, typeof(T)); } private static void RegisterSubClasses(SchemaRegistry schemaRegistry, Type abstractType) { const string discriminatorName = "discriminator"; var parentSchema = schemaRegistry.Definitions[SchemaIdProvider.GetSchemaId(abstractType)]; //set up a discriminator property (it must be required) parentSchema.discriminator = discriminatorName; parentSchema.required = new List<string> { discriminatorName }; if (!parentSchema.properties.ContainsKey(discriminatorName)) parentSchema.properties.Add(discriminatorName, new Schema { type = "string" }); //register all subclasses var derivedTypes = abstractType.Assembly .GetTypes() .Where(x => abstractType != x && abstractType.IsAssignableFrom(x)); foreach (var item in derivedTypes) schemaRegistry.GetOrRegister(item); } } 

क्या पिछले कोड को लागू करता है निर्दिष्ट किया जाता है here, अनुभाग "बहुरूपता समर्थन के साथ मॉडल में यह मूल रूप से निम्नलिखित की तरह कुछ का उत्पादन बाहर? – Craig

+0

अभी तक नहीं है लेकिन मुझे इसे जल्द ही देखना होगा। अगर आपको कुछ भी मिलता है तो कृपया मुझे बताएं –

उत्तर

13

ऐसा लगता है Swashbuckle सही ढंग से बहुरूपता को लागू नहीं करता है और मैं पैरामीटर के रूप में उपवर्गों के बारे में लेखक की दृष्टि को समझने (एक कार्रवाई एक पशु वर्ग expectes अगर और अलग तरीके से व्यवहार करता है, तो आप इसे एक कुत्ते वस्तु या बिल्ली वस्तु के साथ फोन , तो आपके पास 2 अलग-अलग क्रियाएं होनी चाहिए ..) लेकिन वापसी के प्रकार के रूप में मेरा मानना ​​है कि पशु लौटने के लिए सही है और वस्तुएं कुत्ते या बिल्ली के प्रकार हो सकती हैं।

तो मेरी एपीआई का वर्णन है और सही दिशा-निर्देश (वैसे मैं disciminator वर्णन के बारे में पता हो सकता है, अगर आप अपने खुद के discriminator आप विशेष रूप से उस हिस्से में बदलना पड़ सकता है), मैं का उपयोग के साथ लाइन में एक उचित JSON स्कीमा निर्माण करने के लिए इस प्रकार दस्तावेज़ और स्कीमा फिल्टर:।

{ 
    "definitions": { 
    "Pet": { 
     "type": "object", 
     "discriminator": "petType", 
     "properties": { 
     "name": { 
      "type": "string" 
     }, 
     "petType": { 
      "type": "string" 
     } 
     }, 
     "required": [ 
     "name", 
     "petType" 
     ] 
    }, 
    "Cat": { 
     "description": "A representation of a cat", 
     "allOf": [ 
     { 
      "$ref": "#/definitions/Pet" 
     }, 
     { 
      "type": "object", 
      "properties": { 
      "huntingSkill": { 
       "type": "string", 
       "description": "The measured skill for hunting", 
       "default": "lazy", 
       "enum": [ 
       "clueless", 
       "lazy", 
       "adventurous", 
       "aggressive" 
       ] 
      } 
      }, 
      "required": [ 
      "huntingSkill" 
      ] 
     } 
     ] 
    }, 
    "Dog": { 
     "description": "A representation of a dog", 
     "allOf": [ 
     { 
      "$ref": "#/definitions/Pet" 
     }, 
     { 
      "type": "object", 
      "properties": { 
      "packSize": { 
       "type": "integer", 
       "format": "int32", 
       "description": "the size of the pack the dog is from", 
       "default": 0, 
       "minimum": 0 
      } 
      }, 
      "required": [ 
      "packSize" 
      ] 
     } 
     ] 
    } 
    } 
} 
+2

'SchemaIdProvider' आपकी खुद की कक्षा होनी चाहिए? मैंने सोचा कि आप 'swashbuckle.Swagger' का उपयोग करके और फिर कोड की उस पंक्ति को' var parentSchema = schemaRegistry.Definitions [abstractType.FriendlyId] में बदलकर स्वैगर के डिफ़ॉल्ट सम्मेलन का उपयोग कर सकते हैं; ' – wags1999

+0

हां, यह मेरी कक्षा है। मुझे इसकी आवश्यकता है क्योंकि हमारे पास schemaId के लिए एक प्रतिनिधि भी है: कॉन्फ़िगरेशन .chemaId (SchemaIdProvider.GetSchemaId); –

+2

@ पाओलोविगोरी: मैंने इसे स्वाशबकल पर इस्तेमाल किया। एस्पनेटकोर, 'पॉलिमॉर्फिज्म डॉक्यूमेंटफिल्टर' कहा जाता है और कोड में भेदभावकर्ता सेट होता है, लेकिन जेनरेटेड स्वेगर परिभाषा में नहीं। 'allOf' प्रविष्टियां हैं। कोई विचार? – Tseng

संबंधित मुद्दे