using BuildFlow.Shared.Infrastructure; using File.Domain; using File.Infrastructure.Persistence; using File.Infrastructure.Storage; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.Modularity; namespace File.Infrastructure; /// /// Infrastructure 层模块,注册数据库上下文(挂载审计拦截器)与 S3 存储服务。 /// [DependsOn(typeof(FileDomainModule))] public class FileInfrastructureModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { var services = context.Services; var config = services.GetConfiguration(); // DbContext 挂载审计拦截器,统一从 Default 连接串派生(替换 Database 名) var baseConn = config.GetConnectionString("Default")!; var fsConn = $"{baseConn};Database=file_system"; services.AddDbContext((sp, options) => options.UseNpgsql(fsConn) .AddInterceptors(sp.GetRequiredService())); // Scoped 生命周期:每个 HTTP 请求创建一个拦截器实例,确保 ICurrentUserContext 正确获取当前用户 services.AddScoped(); // S3 兼容存储(单例,AmazonS3Client 线程安全可复用) services.Configure(config.GetSection(S3Options.SectionName)); services.AddSingleton(sp => { var options = sp.GetRequiredService>().Value; return new S3StorageService(Options.Create(options)); }); } }