Improve polymorphism & inheritance behavior incl. more flexible config #1766
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #1643
Fixes #1662
Overview
With the existing support for polymorphism/inheritance (enabled with the
GeneratePolymorphicSchemas
setting), Swashbuckle will implicitly use theoneOf
keyword in base type schemas (see "Polymorphism" in the Swagger docs) AND theallOf
keyword in sub type schemas (see "Model Composition" in the Swagger docs).However, it turns out there's many use cases where these two keywords might be used independently. For example,
oneOf
is particularly useful for documenting the various acceptable structures for payloads that are bound to an abstract/base class. ButallOf
on the other hand is more useful for client code generators when you want to maintain an inheritance structure in the generated client models.This PR splits the setting into two separate settings that can be enabled independently or together:
Additionnally, the existing implementation of "Polymorphic" schemas (i.e. schemas that include the
oneOf
keyword) didn't include the abstract/base class itself in the list which is technically incorrect. This PR also addresses this issue by including the abstract/base class in the list.