Swagger sub types selectors (take 2) #17132
Merged
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.
Prerequisites
Description
This is a replacement PR for #17072 ... description is still valid, and originates from the original PR.
This PR introduces a new
ISubTypesSelector
andISubTypesHandler
implementation to allow overriding how Swagger resolves subtypes of a type based on both the base type and the API document name.This is required as the current default behaviour is to resolve all type implementations of the base type across all app domain assemblies. This poses a problem if you have (like we do in Umbraco Commerce) a shared base class used by multiple Swagger documents. In this scenario Swagger will throw an exception as it attempts to load the types from all endpoint definitions, not just the for the given API, casing duplicate schema to be generated.
With this PR in the same way
ISchemaIdSelector
andIOperationIdSelector
allow developers to customise the default behaviour of Umbraco whilst generating Swagger Schemas, this newISubTypesSelector
lets you override the sub type resolution process.In order to maintain backwards compatibility I have set the default
ISchemaIdSelector
to use the previous functionality if no explicitISubTypesSelector
is defined that can handle the supplied type.