using DS.Module.Core.Attributes; using DS.Module.Core.Extensions; using DS.Module.Core.Reflection; using Microsoft.Extensions.DependencyInjection; using System.Reflection; namespace DS.Module.Core.Modules; /// /// 自动注入模块,继承与SuktAppModuleBase类进行实现 /// public class DependencyAppModule : DSAppModule { public override void ConfigureServices(ConfigureServicesContext context) { var services = context.Services; AddAutoInjection(services); } private void AddAutoInjection(IServiceCollection services) { var typeFinder = services.GetOrAddSingletonService(); var baseTypes = new Type[] { typeof(IScopedDependency), typeof(ITransientDependency), typeof(ISingletonDependency) }; var types = typeFinder.FindAll().Distinct(); types = types.Where(type => type.IsClass && !type.IsAbstract && (baseTypes.Any(b => b.IsAssignableFrom(type))) || type.GetCustomAttribute() != null); foreach (var implementedInterType in types) { var attr = implementedInterType.GetCustomAttribute(); var typeInfo = implementedInterType.GetTypeInfo(); var serviceTypes = typeInfo.ImplementedInterfaces .Where(x => x.HasMatchingGenericArity(typeInfo) && !x.HasAttribute() && x != typeof(IDisposable)).Select(t => t.GetRegistrationType(typeInfo)); var lifetime = GetServiceLifetime(implementedInterType); if (lifetime == null) { break; } if (serviceTypes.Count() == 0) { services.Add(new ServiceDescriptor(implementedInterType, implementedInterType, lifetime.Value)); continue; } if (attr?.AddSelf == true) { services.Add(new ServiceDescriptor(implementedInterType, implementedInterType, lifetime.Value)); } foreach (var serviceType in serviceTypes.Where(o => !o.HasAttribute())) { Console.WriteLine(serviceType); services.Add(new ServiceDescriptor(serviceType, implementedInterType, lifetime.Value)); } } } private ServiceLifetime? GetServiceLifetime(Type type) { var attr = type.GetCustomAttribute(); if (attr != null) { return attr.Lifetime; } if (typeof(IScopedDependency).IsAssignableFrom(type)) { return ServiceLifetime.Scoped; } if (typeof(ITransientDependency).IsAssignableFrom(type)) { return ServiceLifetime.Transient; } if (typeof(ISingletonDependency).IsAssignableFrom(type)) { return ServiceLifetime.Singleton; } return null; } public override void ApplicationInitialization(ApplicationContext context) { var app = context.GetApplicationBuilder(); } }