using System.Reflection;
using MiAssessment.Admin.Business.Data;
using MiAssessment.Admin.Business.Models.Config;
using MiAssessment.Admin.Business.Services.Interfaces;
using MiAssessment.Admin.Business.Services.Storage;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace MiAssessment.Admin.Business.Extensions;
///
/// 业务模块服务注册扩展方法
///
public static class ServiceCollectionExtensions
{
///
/// 添加 MiAssessment Admin 业务模块服务
///
/// 服务集合
/// MVC 构建器
/// 配置(可选,用于注册 AdminBusinessDbContext)
/// 服务集合
public static IServiceCollection AddAdminBusiness(this IServiceCollection services, IMvcBuilder mvcBuilder, IConfiguration? configuration = null)
{
// 加载业务模块控制器
var businessAssembly = typeof(ServiceCollectionExtensions).Assembly;
mvcBuilder.AddApplicationPart(businessAssembly);
// 注册 AdminBusinessDbContext(如果提供了配置)
if (configuration != null)
{
services.AddDbContext(options =>
{
options.UseSqlServer(configuration.GetConnectionString("DefaultConnection"));
});
}
// 自动注册业务服务
RegisterBusinessServices(services, businessAssembly);
// 注册存储提供者
RegisterStorageProviders(services);
return services;
}
///
/// 注册存储提供者
///
private static void RegisterStorageProviders(IServiceCollection services)
{
// 注册本地存储提供者
services.AddScoped();
// 注册腾讯云COS存储提供者
services.AddScoped(sp =>
{
var logger = sp.GetRequiredService>();
var configService = sp.GetRequiredService();
// 创建获取配置的委托
Func getUploadSetting = () =>
{
return configService.GetConfigAsync(ConfigKeys.Uploads).GetAwaiter().GetResult();
};
return new TencentCosProvider(logger, getUploadSetting);
});
}
///
/// 自动注册业务服务
/// 扫描程序集中所有实现了 I*Service 接口的服务类并注册
///
private static void RegisterBusinessServices(IServiceCollection services, Assembly assembly)
{
var serviceTypes = assembly.GetTypes()
.Where(t => t.IsClass && !t.IsAbstract && t.Name.EndsWith("Service"))
.ToList();
foreach (var serviceType in serviceTypes)
{
// 查找对应的接口 (例如 ConfigService -> IConfigService)
var interfaceType = serviceType.GetInterfaces()
.FirstOrDefault(i => i.Name == $"I{serviceType.Name}");
if (interfaceType != null)
{
services.AddScoped(interfaceType, serviceType);
}
}
}
}