AssemblyInjectSyncStartStopWorker.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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. //单例组件
  14. var serviceTypes = new HashSet<Type>();
  15. foreach (var svcType in typeof(T).Assembly.GetTypes()
  16. .Where(typeof(IAssemblyInjectSingleton).IsAssignableFrom)
  17. .Where(p => p.IsInterface == false && p.IsAbstract == false)
  18. .OrderBy(p => p.Name))
  19. {
  20. var gsi = svcType.GetInterfaces().Where(p => p.IsGenericType && p.GetGenericTypeDefinition() == typeof(IAssemblyInjectSingleton<>)).ToArray();
  21. foreach (var type in gsi)
  22. {
  23. var addAs = type.GetGenericArguments().First();
  24. serviceTypes.Add(addAs);
  25. }
  26. }
  27. foreach (var serviceType in serviceTypes)
  28. {
  29. var services = serviceProvider.GetServices(serviceType).ToArray();
  30. for (var i = 0; i < services.Length; i++)
  31. {
  32. var service = services[i];
  33. if (service != null) _logger.LogInformation($"Singleton Component Active {service.GetType().FullName}");
  34. else logger.LogWarning($"Encounter null in Active {serviceType.FullName}#{i}");
  35. }
  36. }
  37. foreach (var type in typeof(T).Assembly.GetTypes()
  38. .Where(type => typeof(IAssemblyInjectSingleton).IsAssignableFrom(type) && !typeof(IAssemblyInjectSingleton<>).IsAssignableFrom(type))
  39. .Where(p => p.IsInterface == false && p.IsAbstract == false)
  40. .OrderBy(p => p.Name))
  41. {
  42. var service = serviceProvider.GetService(type);
  43. if (service != null)
  44. {
  45. _logger.LogInformation($"Singleton Component Active {service.GetType().FullName}");
  46. }
  47. }
  48. _services = typeof(T).Assembly.GetTypes()
  49. .Where(typeof(IAssemblyInjectSyncInitStarStop).IsAssignableFrom)
  50. .Where(p => p.IsInterface == false && p.IsAbstract == false)
  51. .OrderBy(p => p.Name)
  52. .SelectMany(p =>
  53. {
  54. var gsi = p.GetInterfaces().Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IAssemblyInjectSyncInitStarStop<>)).ToArray();
  55. return gsi.Length == 0 ? [p] : gsi.Select(gi => gi.GetGenericArguments().First());
  56. })
  57. .Distinct()
  58. .Select(type => (type, serviceProvider.GetService(type)))
  59. .Where(p =>
  60. {
  61. if (p.Item2 == null)
  62. {
  63. logger.LogWarning($"Encounter null in IAssemblyInjectSyncInitStarStop: {p.type.FullName}");
  64. return false;
  65. }
  66. return true;
  67. }).Select(p => p.Item2)
  68. .Cast<IAssemblyInjectSyncInitStarStop>()
  69. .ToArray();
  70. }
  71. public Task StartAsync(CancellationToken cancellationToken)
  72. {
  73. _logger.LogInformation($"Initialization...");
  74. if (_services.Count == 0)
  75. {
  76. _logger.LogInformation($"No component found.");
  77. }
  78. else
  79. {
  80. foreach (var service in _services)
  81. {
  82. _logger.LogInformation($"Initializing {service.GetType()}");
  83. service.Init();
  84. }
  85. _logger.LogInformation($"All components initialized.");
  86. }
  87. _logger.LogInformation($"Starting...");
  88. if (_services.Count == 0)
  89. {
  90. _logger.LogInformation($"No component found.");
  91. }
  92. else
  93. {
  94. foreach (var service in _services)
  95. {
  96. _logger.LogInformation($"Starting {service.GetType()}");
  97. service.Start();
  98. }
  99. _logger.LogInformation($"All components started.");
  100. }
  101. return Task.CompletedTask;
  102. }
  103. public Task StopAsync(CancellationToken cancellationToken)
  104. {
  105. _logger.LogInformation($"Stopping...");
  106. if (_services.Count == 0)
  107. {
  108. _logger.LogInformation($"No component stopped.");
  109. }
  110. else
  111. {
  112. foreach (var service in _services)
  113. {
  114. _logger.LogInformation($"Stopping {service.GetType()}");
  115. service.Stop();
  116. }
  117. _logger.LogInformation($"All components stopped.");
  118. }
  119. return Task.CompletedTask;
  120. }
  121. }