public static void AddAzureServices()

in src/Relecloud.TicketRenderer/Extensions.cs [60:102]


    public static void AddAzureServices(this WebApplicationBuilder builder, TokenCredential credential)
    {
        // Use the Azure Service Bus message bus implementation
        builder.Services.AddAzureServiceBusMessageBus("App:ServiceBus", credential);

        builder.Services.AddOptions<AzureStorageOptions>()
            .BindConfiguration("App:StorageAccount")
            .ValidateDataAnnotations()
            .ValidateOnStart();

        // The AddAzureClients extension method helps add multiple Azure SDK clients
        builder.Services.AddAzureClients(clientConfiguration =>
        {
            clientConfiguration.UseCredential(credential);

            var storageOptions = builder.Configuration.GetRequiredSection("App:StorageAccount").Get<AzureStorageOptions>()
                ?? throw new InvalidOperationException("Storage options (App:StorageAccount) not found");

            if (storageOptions.Uri is null)
            {
                throw new InvalidOperationException("Storage options (App:StorageAccount:Uri) not found");
            }

            var resilienceOptions = builder.Configuration.GetSection("App:Resilience").Get<ResilienceOptions>()
                ?? new ResilienceOptions();

            clientConfiguration.AddBlobServiceClient(new Uri(storageOptions.Uri));

            // ConfigureDefaults sets standard retry policies for all HTTP-based Azure clients.
            // Note that this is not the same as the AddStandardResilienceHandler in ConfigureHttpClientDefaults
            // which applies only to HttpClient instances. Those policies are applied to HTTP clients retrieved
            // from dependency injection but not applied to HTTP clients used by Azure SDK clients.
            clientConfiguration.ConfigureDefaults(options =>
            {
                options.Retry.Mode = RetryMode.Exponential;
                options.Retry.Delay = TimeSpan.FromSeconds(resilienceOptions.BaseDelaySecondsBetweenRetries);
                options.Retry.MaxRetries = resilienceOptions.MaxRetries;
                options.Retry.MaxDelay = TimeSpan.FromSeconds(resilienceOptions.MaxDelaySeconds);
                options.Retry.NetworkTimeout = TimeSpan.FromSeconds(resilienceOptions.MaxNetworkTimeoutSeconds);

            });
        });
    }