AssemblyInjectConfigure.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using Microsoft.Extensions.DependencyInjection;
  2. using Microsoft.Extensions.Logging;
  3. using WarcViewerBlazorWinForm.Library.AssemblyInject.Interfaces;
  4. using WarcViewerBlazorWinForm.Library.AssemblyInject.Services;
  5. namespace WarcViewerBlazorWinForm.Library.AssemblyInject
  6. {
  7. public static class AssemblyInjectConfigure
  8. {
  9. public static void AddAssemblyInject<T>(this IServiceCollection services)
  10. {
  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.Name} @ {svcType.Namespace}");
  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.Name} @ {svcType.Namespace} as {addAs.Name}");
  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.Name} @ {svcType.Namespace} as {addAs.Name}");
  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. //自动启停Worker
  69. services.AddHostedService<AssemblyInjectSyncStartStopWorker<T>>();
  70. }
  71. }
  72. }
  73. }