src/Microsoft.Azure.WebJobs.Extensions.Rpc/Implementation/ExtensionEndpointDataSource.cs (61 lines of code) (raw):

// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; using Microsoft.Azure.WebJobs.Rpc.Core.Internal; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Primitives; namespace Microsoft.Azure.WebJobs.Extensions.Rpc { /// <summary> /// EndpointDataSource for WebJobs extensions. This class is responsible for collecting endpoints /// registered by WebJobs extensions and then exposing them to the host/worker RPC server. /// </summary> internal sealed class ExtensionEndpointDataSource : WebJobsRpcEndpointDataSource { private readonly Lazy<List<Endpoint>> _endpoints; /// <summary> /// Initializes a new instance of the <see cref="ExtensionEndpointDataSource" /> class. /// </summary> /// <param name="services">The service provider.</param> /// <param name="extensions">The registered RPC extensions.</param> public ExtensionEndpointDataSource( IServiceProvider services, IEnumerable<IRpcExtension> extensions, ILogger<ExtensionEndpointDataSource> logger) { ArgumentNullException.ThrowIfNull(services); ArgumentNullException.ThrowIfNull(extensions); ArgumentNullException.ThrowIfNull(logger); _endpoints = new(() => { try { logger.ApplyRpcExtensionsBegin(); ExtensionEndpointRouteBuilder builder = new(services); foreach (IRpcExtension extension in extensions) { extension.Apply(builder, logger); } List<Endpoint> endpoints = builder.DataSources.SelectMany(ds => ds.Endpoints).ToList(); logger.ApplyRpcExtensionsEnd(endpoints.Count); return endpoints; } catch (Exception ex) { logger.ApplyRpcExtensionsError(ex); throw; } }); } /// <inheritdoc /> public override IReadOnlyList<Endpoint> Endpoints => _endpoints.Value; /// <inheritdoc /> public override IChangeToken GetChangeToken() => NullChangeToken.Singleton; private class ExtensionEndpointRouteBuilder : IEndpointRouteBuilder { public ExtensionEndpointRouteBuilder(IServiceProvider serviceProvider) { ServiceProvider = serviceProvider; } public IServiceProvider ServiceProvider { get; } public ICollection<EndpointDataSource> DataSources { get; } = new List<EndpointDataSource>(); public IApplicationBuilder CreateApplicationBuilder() { return new ApplicationBuilder(ServiceProvider); } } } }