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);
});
});
}