using Infrastructure.Attribute; using Microsoft.Extensions.DependencyInjection; using System; using System.Linq; using System.Reflection; namespace Infrastructure.Extensions { public static class AppServiceExtensions { /// /// 注册引用程序域中所有有AppService标记的类的服务 /// /// public static void AddAppService(this IServiceCollection services) { //var assemblies = AppDomain.CurrentDomain.GetAssemblies(); string []cls = new string[] { "ZR.Repository", "ZR.Service", "ZR.Tasks" }; foreach (var item in cls) { Assembly assembly = Assembly.Load(item); Register(services, assembly); } } private static void Register(IServiceCollection services, Assembly assembly) { foreach (var type in assembly.GetTypes()) { var serviceAttribute = type.GetCustomAttribute(); if (serviceAttribute != null) { var serviceType = serviceAttribute.ServiceType; //情况1 适用于依赖抽象编程,注意这里只获取第一个 if (serviceType == null && serviceAttribute.InterfaceServiceType) { serviceType = type.GetInterfaces().FirstOrDefault(); } //情况2 不常见特殊情况下才会指定ServiceType,写起来麻烦 if (serviceType == null) { serviceType = type; } switch (serviceAttribute.ServiceLifetime) { case LifeTime.Singleton: services.AddSingleton(serviceType, type); break; case LifeTime.Scoped: services.AddScoped(serviceType, type); break; case LifeTime.Transient: services.AddTransient(serviceType, type); break; default: services.AddTransient(serviceType, type); break; } //Console.WriteLine($"注册:{serviceType}"); } else { //Console.WriteLine($"注册:{serviceType}"); } } } } }