using Microsoft.Extensions.Configuration; using System.Reflection; using YY.Admin.Core; using YY.Admin.Services.Service.Auth; namespace YY.Admin { public static class ServiceExtensions { /// /// 注册服务 /// public static void AddService(this IContainerRegistry containerRegistry, IConfiguration configuration) { // 注册配置 containerRegistry.RegisterInstance(configuration); //// 注册日志服务为单例 containerRegistry.RegisterSingleton(); // 自动扫描并注册应用层服务 RegisterServicesByAssembly(containerRegistry, typeof(ISysAuthService).Assembly); } /// /// 自动注册程序集中所有服务 /// private static void RegisterServicesByAssembly(IContainerRegistry containerRegistry, Assembly assembly) { // 获取所有公开的非抽象类 var serviceTypes = assembly.GetExportedTypes() .Where(t => t.IsClass && !t.IsAbstract); foreach (var implementationType in serviceTypes) { // 查找服务接口(名称以"I"开头,去掉首字母后匹配) var serviceInterface = implementationType.GetInterfaces() .FirstOrDefault(i => i.Name == $"I{implementationType.Name}"); // 如果没有直接匹配的接口,尝试查找其他接口 if (serviceInterface == null) { // 备选方案1:注册所有实现的接口(适合多接口实现) RegisterAllInterfaces(containerRegistry, implementationType); // 备选方案2:只注册主接口 // serviceInterface = implementationType.GetInterface($"I{implementationType.Name}"); } else { // 注册找到的接口 RegisterService(containerRegistry, serviceInterface, implementationType); } } } /// /// 注册服务到容器 /// private static void RegisterService( IContainerRegistry containerRegistry, Type serviceType, Type implementationType) { // 根据命名约定判断生命周期 bool isSingleton = implementationType.Name.EndsWith("Service") || implementationType.Name.EndsWith("Repository"); // 根据基类判断生命周期 bool isSingletonByBase = typeof(ISingletonDependency).IsAssignableFrom(implementationType); // 根据特性判断生命周期 var attribute = implementationType.GetCustomAttribute(); var lifecycle = attribute?.Lifecycle ?? Lifecycle.Transient; // 确定注册方式 if (isSingleton || isSingletonByBase || lifecycle == Lifecycle.Singleton) { containerRegistry.RegisterSingleton(serviceType, implementationType); Console.WriteLine($"注册单例服务: {serviceType.Name} -> {implementationType.Name}"); } else { containerRegistry.Register(serviceType, implementationType); Console.WriteLine($"注册瞬时服务: {serviceType.Name} -> {implementationType.Name}"); } } /// /// 注册所有实现的接口 /// private static void RegisterAllInterfaces(IContainerRegistry containerRegistry, Type implementationType) { var interfaces = implementationType.GetInterfaces() .Where(i => i != typeof(IDisposable) && !i.Name.StartsWith("_") && // 排除某些特殊接口 i.Assembly == implementationType.Assembly); // 只注册同程序集接口 foreach (var serviceType in interfaces) { RegisterService(containerRegistry, serviceType, implementationType); } if (!interfaces.Any()) { // 如果没有接口,直接注册具体类型 containerRegistry.Register(implementationType); Console.WriteLine($"注册具体类型: {implementationType.Name}"); } } } }