| File: HtmlRendering\HtmlRenderer.cs | Web Access |
| Project: src\aspnetcore\src\Components\Web\src\Microsoft.AspNetCore.Components.Web.csproj (Microsoft.AspNetCore.Components.Web) |
// 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.CodeAnalysis; using Microsoft.AspNetCore.Components.HtmlRendering.Infrastructure; using Microsoft.AspNetCore.Components.Web.HtmlRendering; using Microsoft.Extensions.Logging; namespace Microsoft.AspNetCore.Components.Web; /// <summary> /// Provides a mechanism for rendering components non-interactively as HTML markup. /// </summary> public sealed class HtmlRenderer : IDisposable, IAsyncDisposable { private readonly StaticHtmlRenderer _passiveHtmlRenderer; /// <summary> /// Constructs an instance of <see cref="HtmlRenderer"/>. /// </summary> /// <param name="services">The services to use when rendering components.</param> /// <param name="loggerFactory">The logger factory to use.</param> public HtmlRenderer(IServiceProvider services, ILoggerFactory loggerFactory) { _passiveHtmlRenderer = new StaticHtmlRenderer(services, loggerFactory); } /// <inheritdoc /> public void Dispose() => _passiveHtmlRenderer.Dispose(); /// <inheritdoc /> public ValueTask DisposeAsync() => _passiveHtmlRenderer.DisposeAsync(); /// <summary> /// Gets the <see cref="Components.Dispatcher" /> associated with this instance. Any calls to /// <see cref="RenderComponentAsync{TComponent}()"/> or <see cref="BeginRenderingComponent{TComponent}()"/> /// must be performed using this <see cref="Components.Dispatcher" />. /// </summary> public Dispatcher Dispatcher => _passiveHtmlRenderer.Dispatcher; /// <summary> /// Adds an instance of the specified component and instructs it to render. The resulting content represents the /// initial synchronous rendering output, which may later change. To wait for the component hierarchy to complete /// any asynchronous operations such as loading, await <see cref="HtmlRootComponent.QuiescenceTask"/> before /// reading content from the <see cref="HtmlRootComponent"/>. /// </summary> /// <typeparam name="TComponent">The component type.</typeparam> /// <returns>An <see cref="HtmlRootComponent"/> instance representing the render output.</returns> public HtmlRootComponent BeginRenderingComponent<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TComponent>() where TComponent : IComponent => _passiveHtmlRenderer.BeginRenderingComponent(typeof(TComponent), ParameterView.Empty); /// <summary> /// Adds an instance of the specified component and instructs it to render. The resulting content represents the /// initial synchronous rendering output, which may later change. To wait for the component hierarchy to complete /// any asynchronous operations such as loading, await <see cref="HtmlRootComponent.QuiescenceTask"/> before /// reading content from the <see cref="HtmlRootComponent"/>. /// </summary> /// <typeparam name="TComponent">The component type.</typeparam> /// <param name="parameters">Parameters for the component.</param> /// <returns>An <see cref="HtmlRootComponent"/> instance representing the render output.</returns> public HtmlRootComponent BeginRenderingComponent<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TComponent>( ParameterView parameters) where TComponent : IComponent => _passiveHtmlRenderer.BeginRenderingComponent(typeof(TComponent), parameters); /// <summary> /// Adds an instance of the specified component and instructs it to render. The resulting content represents the /// initial synchronous rendering output, which may later change. To wait for the component hierarchy to complete /// any asynchronous operations such as loading, await <see cref="HtmlRootComponent.QuiescenceTask"/> before /// reading content from the <see cref="HtmlRootComponent"/>. /// </summary> /// <param name="componentType">The component type. This must implement <see cref="IComponent"/>.</param> /// <returns>An <see cref="HtmlRootComponent"/> instance representing the render output.</returns> public HtmlRootComponent BeginRenderingComponent( [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type componentType) => _passiveHtmlRenderer.BeginRenderingComponent(componentType, ParameterView.Empty); /// <summary> /// Adds an instance of the specified component and instructs it to render. The resulting content represents the /// initial synchronous rendering output, which may later change. To wait for the component hierarchy to complete /// any asynchronous operations such as loading, await <see cref="HtmlRootComponent.QuiescenceTask"/> before /// reading content from the <see cref="HtmlRootComponent"/>. /// </summary> /// <param name="componentType">The component type. This must implement <see cref="IComponent"/>.</param> /// <param name="parameters">Parameters for the component.</param> /// <returns>An <see cref="HtmlRootComponent"/> instance representing the render output.</returns> public HtmlRootComponent BeginRenderingComponent( [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type componentType, ParameterView parameters) => _passiveHtmlRenderer.BeginRenderingComponent(componentType, parameters); /// <summary> /// Adds an instance of the specified component and instructs it to render, waiting /// for the component hierarchy to complete asynchronous tasks such as loading. /// </summary> /// <typeparam name="TComponent">The component type.</typeparam> /// <returns>A task that completes with <see cref="HtmlRootComponent"/> once the component hierarchy has completed any asynchronous tasks such as loading.</returns> public Task<HtmlRootComponent> RenderComponentAsync<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TComponent>() where TComponent : IComponent => RenderComponentAsync<TComponent>(ParameterView.Empty); /// <summary> /// Adds an instance of the specified component and instructs it to render, waiting /// for the component hierarchy to complete asynchronous tasks such as loading. /// </summary> /// <param name="componentType">The component type. This must implement <see cref="IComponent"/>.</param> /// <returns>A task that completes with <see cref="HtmlRootComponent"/> once the component hierarchy has completed any asynchronous tasks such as loading.</returns> public Task<HtmlRootComponent> RenderComponentAsync( [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type componentType) => RenderComponentAsync(componentType, ParameterView.Empty); /// <summary> /// Adds an instance of the specified component and instructs it to render, waiting /// for the component hierarchy to complete asynchronous tasks such as loading. /// </summary> /// <typeparam name="TComponent">The component type.</typeparam> /// <param name="parameters">Parameters for the component.</param> /// <returns>A task that completes with <see cref="HtmlRootComponent"/> once the component hierarchy has completed any asynchronous tasks such as loading.</returns> public Task<HtmlRootComponent> RenderComponentAsync<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TComponent>( ParameterView parameters) where TComponent : IComponent => RenderComponentAsync(typeof (TComponent), parameters); /// <summary> /// Adds an instance of the specified component and instructs it to render, waiting /// for the component hierarchy to complete asynchronous tasks such as loading. /// </summary> /// <param name="componentType">The component type. This must implement <see cref="IComponent"/>.</param> /// <param name="parameters">Parameters for the component.</param> /// <returns>A task that completes with <see cref="HtmlRootComponent"/> once the component hierarchy has completed any asynchronous tasks such as loading.</returns> public async Task<HtmlRootComponent> RenderComponentAsync( [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type componentType, ParameterView parameters) { var content = BeginRenderingComponent(componentType, parameters); await content.QuiescenceTask; return content; } }