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