File: EventHubConsumerClientComponent.cs
Web Access
Project: src\src\Components\Aspire.Azure.Messaging.EventHubs\Aspire.Azure.Messaging.EventHubs.csproj (Aspire.Azure.Messaging.EventHubs)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Aspire.Azure.Messaging.EventHubs;
using Azure.Core.Extensions;
using Azure.Messaging.EventHubs.Consumer;
using Microsoft.Extensions.Azure;
using Microsoft.Extensions.Configuration;
 
namespace Microsoft.Extensions.Hosting;
 
internal sealed class EventHubConsumerClientComponent : EventHubsComponent<AzureMessagingEventHubsConsumerSettings, EventHubConsumerClient, EventHubConsumerClientOptions>
{
    // cannot be in base class as source generator chokes on generic placeholders
    protected override void BindClientOptionsToConfiguration(IAzureClientBuilder<EventHubConsumerClient, EventHubConsumerClientOptions> clientBuilder, IConfiguration configuration)
    {
#pragma warning disable IDE0200 // Remove unnecessary lambda expression - needed so the ConfigBinder Source Generator works
        clientBuilder.ConfigureOptions(options => configuration.Bind(options));
#pragma warning restore IDE0200
    }
 
    protected override void BindSettingsToConfiguration(AzureMessagingEventHubsConsumerSettings settings, IConfiguration config)
    {
        config.Bind(settings);
    }
 
    protected override IAzureClientBuilder<EventHubConsumerClient, EventHubConsumerClientOptions> AddClient(
        AzureClientFactoryBuilder azureFactoryBuilder, AzureMessagingEventHubsConsumerSettings settings,
        string connectionName, string configurationSectionName)
    {
        return ((IAzureClientFactoryBuilderWithCredential)azureFactoryBuilder).RegisterClientFactory<EventHubConsumerClient, EventHubConsumerClientOptions>((options, cred) =>
        {
            // ensure that the connection string or namespace+eventhubname is provided 
            EnsureConnectionStringOrNamespaceProvided(settings, connectionName, configurationSectionName);
 
            var consumerGroup = settings.ConsumerGroup ?? EventHubConsumerClient.DefaultConsumerGroupName;
 
            // If no connection is provided use TokenCredential
            if (string.IsNullOrEmpty(settings.ConnectionString))
            {
                return new EventHubConsumerClient(consumerGroup, settings.FullyQualifiedNamespace, settings.EventHubName, cred, options);
            }
 
            // If no specific EventHubName is provided, it has to be in the connection string
            if (string.IsNullOrEmpty(settings.EventHubName))
            {
                return new EventHubConsumerClient(consumerGroup, settings.ConnectionString, options);
            }
 
            return new EventHubConsumerClient(consumerGroup, settings.ConnectionString, settings.EventHubName, options);
 
        }, requiresCredential: false);
    }
}