Skip to content
Merged
1 change: 1 addition & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
<PackageVersion Include="Oracle.EntityFrameworkCore" Version="8.21.121" />
<PackageVersion Include="Polly" Version="8.3.0" />
<PackageVersion Include="Polly.Core" Version="8.3.0" />
<PackageVersion Include="Polly.Extensions" Version="8.3.0" />
<PackageVersion Include="Pomelo.EntityFrameworkCore.MySql" Version="8.0.0-beta.2" />
<PackageVersion Include="RabbitMQ.Client" Version="6.8.1" />
<PackageVersion Include="StackExchange.Redis" Version="2.7.17" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" />
<PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" />
<PackageReference Include="MySqlConnector.Logging.Microsoft.Extensions.Logging" />
<PackageReference Include="Polly.Extensions" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" />
<PackageReference Include="OpenTelemetry.Instrumentation.EventCounters" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using MySqlConnector;
using MySqlConnector.Logging;
using OpenTelemetry.Metrics;
using Polly;
using Polly.Registry;
using Polly.Retry;
using Pomelo.EntityFrameworkCore.MySql.Infrastructure.Internal;

namespace Microsoft.Extensions.Hosting;
Expand Down Expand Up @@ -65,6 +69,22 @@ public static partial class AspireEFMySqlExtensions

builder.Services.AddDbContextPool<TContext>(ConfigureDbContext);

const string resilienceKey = "Microsoft.Extensions.Hosting.AspireEFMySqlExtensions.ServerVersion";
builder.Services.AddResiliencePipeline(resilienceKey, static builder =>
{
// Values are taken from MySqlRetryingExecutionStrategy.MaxRetryCount and MaxRetryDelay.
builder.AddRetry(new RetryStrategyOptions
{
ShouldHandle = static args => args.Outcome is { Exception: MySqlException { IsTransient: true } }
? PredicateResult.True()
: PredicateResult.False(),
BackoffType = DelayBackoffType.Exponential,
MaxRetryAttempts = 6,
Delay = TimeSpan.FromSeconds(1),
MaxDelay = TimeSpan.FromSeconds(30),
});
});

ConfigureInstrumentation<TContext>(builder, settings);

void ConfigureDbContext(IServiceProvider serviceProvider, DbContextOptionsBuilder dbContextOptionsBuilder)
Expand All @@ -81,7 +101,10 @@ void ConfigureDbContext(IServiceProvider serviceProvider, DbContextOptionsBuilde
if (settings.ServerVersion is null)
{
ConnectionStringValidation.ValidateConnectionString(settings.ConnectionString, connectionName, DefaultConfigSectionName, $"{DefaultConfigSectionName}:{typeof(TContext).Name}", isEfDesignTime: EF.IsDesignTime);
serverVersion = ServerVersion.AutoDetect(connectionString);

var resiliencePipelineProvider = serviceProvider.GetRequiredService<ResiliencePipelineProvider<string>>();
var resiliencePipeline = resiliencePipelineProvider.GetPipeline(resilienceKey);
serverVersion = resiliencePipeline.Execute(static cs => ServerVersion.AutoDetect(cs), connectionString);
}
else
{
Expand Down