AssemblyInjectSyncStartStopWorker.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. using PCC.Common.AssemblyInject.Interfaces;
  2. namespace PCC.Common.AssemblyInject.Services;
  3. internal class AssemblyInjectSyncStartStopWorker<T> : IHostedService
  4. {
  5. private readonly ILogger<AssemblyInjectSyncStartStopWorker<T>> _logger;
  6. private readonly IReadOnlyCollection<IAssemblyInjectSyncInitStarStop> _services;
  7. public AssemblyInjectSyncStartStopWorker(
  8. IServiceProvider serviceProvider,
  9. ILogger<AssemblyInjectSyncStartStopWorker<T>> logger)
  10. {
  11. _logger = logger;
  12. _logger.LogInformation("Activating Singleton Component...");
  13. _services = typeof(T).Assembly.GetTypes()
  14. .Where(typeof(IAssemblyInjectSyncInitStarStop).IsAssignableFrom)
  15. .Where(p => p.IsInterface == false && p.IsAbstract == false)
  16. .OrderBy(p => p.Name)
  17. .Select(serviceProvider.GetRequiredService)
  18. .Cast<IAssemblyInjectSyncInitStarStop>()
  19. .ToArray();
  20. //单例组件
  21. var serviceTypes = new HashSet<Type>();
  22. foreach (var svcType in typeof(T).Assembly.GetTypes()
  23. .Where(typeof(IAssemblyInjectSingleton).IsAssignableFrom)
  24. .Where(p => p.IsInterface == false && p.IsAbstract == false)
  25. .OrderBy(p => p.Name))
  26. {
  27. var gsi = svcType.GetInterfaces().Where(p => p.IsGenericType && p.GetGenericTypeDefinition() == typeof(IAssemblyInjectSingleton<>)).ToArray();
  28. foreach (var type in gsi)
  29. {
  30. var addAs = type.GetGenericArguments().First()!;
  31. serviceTypes.Add(addAs);
  32. }
  33. }
  34. foreach (var serviceType in serviceTypes)
  35. {
  36. var services = serviceProvider.GetServices(serviceType).ToArray();
  37. for (var i = 0; i < services.Length; i++)
  38. {
  39. var service = services[i];
  40. if (service != null) _logger.LogInformation($"Singleton Component Active {service.GetType().FullName}");
  41. else logger.LogWarning($"Encounter null in Active {serviceType.FullName}#{i}");
  42. }
  43. }
  44. foreach (var type in typeof(T).Assembly.GetTypes()
  45. .Where(type => typeof(IAssemblyInjectSingleton).IsAssignableFrom(type) && !typeof(IAssemblyInjectSingleton<>).IsAssignableFrom(type))
  46. .Where(p => p.IsInterface == false && p.IsAbstract == false)
  47. .OrderBy(p => p.Name))
  48. {
  49. var service = serviceProvider.GetService(type);
  50. if (service != null)
  51. {
  52. _logger.LogInformation($"Singleton Component Active {service.GetType().FullName}");
  53. }
  54. }
  55. }
  56. public Task StartAsync(CancellationToken cancellationToken)
  57. {
  58. _logger.LogInformation($"Initialization...");
  59. if (_services.Count == 0)
  60. {
  61. _logger.LogInformation($"No component found.");
  62. }
  63. else
  64. {
  65. foreach (var service in _services)
  66. {
  67. _logger.LogInformation($"Initializing {service.GetType()}");
  68. service.Init();
  69. }
  70. _logger.LogInformation($"All components initialized.");
  71. }
  72. _logger.LogInformation($"Starting...");
  73. if (_services.Count == 0)
  74. {
  75. _logger.LogInformation($"No component found.");
  76. }
  77. else
  78. {
  79. foreach (var service in _services)
  80. {
  81. _logger.LogInformation($"Starting {service.GetType()}");
  82. service.Start();
  83. }
  84. _logger.LogInformation($"All components started.");
  85. }
  86. return Task.CompletedTask;
  87. }
  88. public Task StopAsync(CancellationToken cancellationToken)
  89. {
  90. _logger.LogInformation($"Stopping...");
  91. if (_services.Count == 0)
  92. {
  93. _logger.LogInformation($"No component stopped.");
  94. }
  95. else
  96. {
  97. foreach (var service in _services)
  98. {
  99. _logger.LogInformation($"Stopping {service.GetType()}");
  100. service.Stop();
  101. }
  102. _logger.LogInformation($"All components stopped.");
  103. }
  104. return Task.CompletedTask;
  105. }
  106. }