RepositoryExtension.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Reflection;
  5. using Microsoft.Extensions.DependencyInjection;
  6. using Datory;
  7. namespace GxPress.Api.ServiceExtensions
  8. {
  9. public static class RepositoryExtension
  10. {
  11. /// <summary>
  12. /// 注入仓储
  13. /// </summary>
  14. /// <param name="services"></param>
  15. /// <returns></returns>
  16. public static IServiceCollection AddRepositories(this IServiceCollection services)
  17. {
  18. var baseType = typeof(IRepository);
  19. var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
  20. var referencedAssemblies = Directory.GetFiles(path, "GxPress.Repository.*.dll").Select(Assembly.LoadFrom).ToArray();
  21. var types = referencedAssemblies
  22. .SelectMany(a => a.DefinedTypes)
  23. .Select(type => type.AsType())
  24. .Where(x => x != baseType && baseType.IsAssignableFrom(x)).ToArray();
  25. var implementTypes = types.Where(x => x.IsClass).ToArray();
  26. var interfaceTypes = types.Where(x => x.IsInterface).ToArray();
  27. foreach (var implementType in implementTypes)
  28. {
  29. var interfaceType = interfaceTypes.FirstOrDefault(x => x.IsAssignableFrom(implementType));
  30. if (interfaceType != null)
  31. services.AddScoped(interfaceType, implementType);
  32. }
  33. return services;
  34. }
  35. }
  36. }