| File: Transformers\TypeBasedOpenApiDocumentTransformer.cs | Web Access |
| Project: src\aspnetcore\src\OpenApi\src\Microsoft.AspNetCore.OpenApi.csproj (Microsoft.AspNetCore.OpenApi) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNetCore.OpenApi; internal sealed class TypeBasedOpenApiDocumentTransformer : IOpenApiDocumentTransformer { [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] private readonly Type _transformerType; private readonly ObjectFactory _transformerFactory; internal TypeBasedOpenApiDocumentTransformer([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type transformerType) { _transformerType = transformerType; _transformerFactory = ActivatorUtilities.CreateFactory(_transformerType, []); } public async Task TransformAsync(OpenApiDocument document, OpenApiDocumentTransformerContext context, CancellationToken cancellationToken) { var transformer = _transformerFactory.Invoke(context.ApplicationServices, []) as IOpenApiDocumentTransformer; Debug.Assert(transformer != null, $"The type {_transformerType} does not implement {nameof(IOpenApiDocumentTransformer)}."); try { await transformer.TransformAsync(document, context, cancellationToken); } finally { if (transformer is IAsyncDisposable asyncDisposable) { await asyncDisposable.DisposeAsync(); } else if (transformer is IDisposable disposable) { disposable.Dispose(); } } } }