Register AuditableEntityInterceptor as a singleton and attach it through the AddDbContext options callback instead of newing it up inside Database.OnConfiguring. The interceptor is stateless, so a single shared instance is reused across contexts and its wiring lives in the DI layer. The design-time factory keeps working (interceptor is runtime-only, irrelevant for migrations). Verified: build + ef migrations list (design-time context) OK; the Worker host builds and validates the full DI graph (reaches endpoint configuration) with no captive-dependency or interceptor error. Build: 0 warnings, 0 errors.
32 lines
1.3 KiB
C#
32 lines
1.3 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.Options;
|
|
using Musify.Application.Contracts;
|
|
using Musify.Infrastructure.Configuration;
|
|
|
|
namespace Musify.Infrastructure.Persistence
|
|
{
|
|
public static class DatabaseDependencyInjection
|
|
{
|
|
public static IServiceCollection AddDatabase(this IServiceCollection serviceDescriptors, IConfiguration configuration)
|
|
{
|
|
serviceDescriptors
|
|
.AddOptionsWithValidateOnStart<DatabaseConfiguration>()
|
|
.Bind(configuration.GetRequiredSection(DatabaseConfiguration.SectionName))
|
|
.ValidateDataAnnotations();
|
|
|
|
serviceDescriptors.AddSingleton(serviceProvider =>
|
|
serviceProvider.GetRequiredService<IOptions<DatabaseConfiguration>>().Value);
|
|
|
|
serviceDescriptors.AddSingleton<AuditableEntityInterceptor>();
|
|
|
|
serviceDescriptors.AddDbContext<Database>((serviceProvider, options) =>
|
|
options.AddInterceptors(serviceProvider.GetRequiredService<AuditableEntityInterceptor>()));
|
|
|
|
serviceDescriptors.AddScoped<IDatabase>(serviceProvider => serviceProvider.GetRequiredService<Database>());
|
|
|
|
return serviceDescriptors;
|
|
}
|
|
}
|
|
} |