AssemblyInjectConfigure.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using PCC.Common.AssemblyInject.Interfaces;
  2. using PCC.Common.AssemblyInject.Services;
  3. namespace PCC.Common.AssemblyInject;
  4. internal class AssemblyInject { }
  5. public static class AssemblyInjectConfigure
  6. {
  7. public static void AddAssemblyInject<T>(this IServiceCollection services)
  8. {
  9. var aiLogger = services.BuildServiceProvider().GetService<ILogger<AssemblyInject>>();
  10. aiLogger?.LogInformation("Discovering components...");
  11. var componentsAdded = 0;
  12. //单例组件
  13. var siLogger = services.BuildServiceProvider().GetService<ILogger<IAssemblyInjectSingleton>>();
  14. foreach (var svcType in typeof(T).Assembly.GetTypes()
  15. .Where(typeof(IAssemblyInjectSingleton).IsAssignableFrom)
  16. .Where(p => p.IsInterface == false && p.IsAbstract == false)
  17. .OrderBy(p => p.Name))
  18. {
  19. var gsi = svcType.GetInterfaces().Where(p => p.IsGenericType && p.GetGenericTypeDefinition() == typeof(IAssemblyInjectSingleton<>)).ToArray();
  20. if (gsi.Length == 0)
  21. {
  22. siLogger?.LogInformation($"AddSingleton {svcType.FullName}");
  23. services.AddSingleton(svcType);
  24. ++componentsAdded;
  25. }
  26. else
  27. {
  28. foreach (var type in gsi)
  29. {
  30. var addAs = type.GetGenericArguments().First()!;
  31. siLogger?.LogInformation($"AddSingleton {svcType.FullName} as {addAs.FullName}");
  32. services.AddSingleton(addAs, svcType);
  33. ++componentsAdded;
  34. }
  35. }
  36. }
  37. //Transient组件
  38. var tsLogger = services.BuildServiceProvider().GetService<ILogger<IAssemblyInjectTransient>>();
  39. foreach (var svcType in typeof(T).Assembly.GetTypes()
  40. .Where(typeof(IAssemblyInjectTransient).IsAssignableFrom)
  41. .Where(p => p.IsInterface == false && p.IsAbstract == false))
  42. {
  43. var gsi = svcType.GetInterfaces().Where(p => p.IsGenericType && p.GetGenericTypeDefinition() == typeof(IAssemblyInjectTransient<>)).ToArray();
  44. if (gsi.Length == 0)
  45. {
  46. tsLogger?.LogInformation($"AddTransient {svcType.FullName}");
  47. services.AddTransient(svcType);
  48. ++componentsAdded;
  49. }
  50. else
  51. {
  52. foreach (var type in gsi)
  53. {
  54. var addAs = type.GetGenericArguments().First()!;
  55. siLogger?.LogInformation($"AddTransient {svcType.FullName} as {addAs.FullName}");
  56. services.AddTransient(addAs, svcType);
  57. ++componentsAdded;
  58. }
  59. }
  60. }
  61. if (componentsAdded == 0)
  62. {
  63. var logger = services.BuildServiceProvider().GetService<ILogger<AssemblyInjectSyncStartStopWorker<T>>>();
  64. logger?.LogWarning("Skip: No found any AssemblyInject components");
  65. }
  66. else
  67. {
  68. aiLogger?.LogInformation($"Discovered number of components:{componentsAdded}");
  69. //自动启停Worker
  70. services.AddHostedService<AssemblyInjectSyncStartStopWorker<T>>();
  71. }
  72. }
  73. }