using System; using System.IO; using System.Linq; using System.Reflection; using Microsoft.Extensions.DependencyInjection; using Datory; namespace GxPress.Api.ServiceExtensions { public static class RepositoryExtension { /// /// 注入仓储 /// /// /// public static IServiceCollection AddRepositories(this IServiceCollection services) { var baseType = typeof(IRepository); var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory; var referencedAssemblies = Directory.GetFiles(path, "GxPress.Repository.*.dll").Select(Assembly.LoadFrom).ToArray(); var types = referencedAssemblies .SelectMany(a => a.DefinedTypes) .Select(type => type.AsType()) .Where(x => x != baseType && baseType.IsAssignableFrom(x)).ToArray(); var implementTypes = types.Where(x => x.IsClass).ToArray(); var interfaceTypes = types.Where(x => x.IsInterface).ToArray(); foreach (var implementType in implementTypes) { var interfaceType = interfaceTypes.FirstOrDefault(x => x.IsAssignableFrom(implementType)); if (interfaceType != null) services.AddScoped(interfaceType, implementType); } return services; } } }