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