1
1

ServiceCollectionExtensions.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using Masuit.Tools.AspNetCore.ResumeFileResults.Executor;
  2. using Masuit.Tools.AspNetCore.ResumeFileResults.ResumeFileResult;
  3. using Masuit.Tools.Core.Net;
  4. using Masuit.Tools.Files;
  5. using Microsoft.AspNetCore.Builder;
  6. using Microsoft.AspNetCore.Http;
  7. using Microsoft.AspNetCore.Mvc.Infrastructure;
  8. using Microsoft.Extensions.DependencyInjection;
  9. using Microsoft.Extensions.DependencyInjection.Extensions;
  10. using Microsoft.Extensions.Hosting;
  11. using System.Collections.Generic;
  12. using System.Reflection;
  13. using System;
  14. using System.Linq;
  15. namespace Masuit.Tools.Core.AspNetCore;
  16. /// <summary>
  17. /// 依赖注入ServiceCollection容器扩展方法
  18. /// </summary>
  19. public static class ServiceCollectionExtensions
  20. {
  21. /// <summary>
  22. /// 注入断点续传服务
  23. /// </summary>
  24. /// <param name="services"></param>
  25. /// <returns></returns>
  26. public static IServiceCollection AddResumeFileResult(this IServiceCollection services)
  27. {
  28. services.TryAddSingleton<IActionResultExecutor<ResumePhysicalFileResult>, ResumePhysicalFileResultExecutor>();
  29. services.TryAddSingleton<IActionResultExecutor<ResumeVirtualFileResult>, ResumeVirtualFileResultExecutor>();
  30. services.TryAddSingleton<IActionResultExecutor<ResumeFileStreamResult>, ResumeFileStreamResultExecutor>();
  31. services.TryAddSingleton<IActionResultExecutor<ResumeFileContentResult>, ResumeFileContentResultExecutor>();
  32. return services;
  33. }
  34. /// <summary>
  35. /// 注入7z压缩
  36. /// </summary>
  37. /// <param name="services"></param>
  38. /// <returns></returns>
  39. public static IServiceCollection AddSevenZipCompressor(this IServiceCollection services)
  40. {
  41. services.AddHttpClient<ISevenZipCompressor, SevenZipCompressor>();
  42. return services;
  43. }
  44. /// <summary>
  45. /// 注入HttpContext静态对象,方便在任意地方获取HttpContext,services.AddHttpContextAccessor();
  46. /// </summary>
  47. /// <param name="services"></param>
  48. public static void AddStaticHttpContext(this IServiceCollection services)
  49. {
  50. services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
  51. }
  52. /// <summary>
  53. /// 注入HttpContext静态对象,方便在任意地方获取HttpContext,app.UseStaticHttpContext();
  54. /// </summary>
  55. /// <param name="app"></param>
  56. /// <returns></returns>
  57. public static IApplicationBuilder UseStaticHttpContext(this IApplicationBuilder app)
  58. {
  59. var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
  60. HttpContext2.Configure(httpContextAccessor);
  61. return app;
  62. }
  63. /// <summary>
  64. /// 自动扫描需要注册的服务,被ServiceInject标记的class可自动注入
  65. /// </summary>
  66. /// <param name="services"></param>
  67. public static void AutoRegisterServices(this IServiceCollection services)
  68. {
  69. var assemblies = AppDomain.CurrentDomain.GetAssemblies();
  70. services.RegisterServiceByAttribute(assemblies);
  71. services.RegisterBackgroundService(assemblies);
  72. }
  73. /// <summary>
  74. /// 通过 ServiceAttribute 批量注册服务
  75. /// </summary>
  76. /// <param name="services"></param>
  77. private static void RegisterServiceByAttribute(this IServiceCollection services, IEnumerable<Assembly> assemblies)
  78. {
  79. var types = assemblies.SelectMany(t => t.GetTypes()).Where(t => t.GetCustomAttributes(typeof(ServiceInjectAttribute), false).Length > 0 && t.IsClass && !t.IsAbstract).ToList();
  80. foreach (var type in types)
  81. {
  82. var typeInterface = type.GetInterfaces().FirstOrDefault();
  83. if (typeInterface == null)
  84. {
  85. //服务非继承自接口的直接注入
  86. switch (type.GetCustomAttribute<ServiceInjectAttribute>().Lifetime)
  87. {
  88. case ServiceLifetime.Singleton: services.AddSingleton(type); break;
  89. case ServiceLifetime.Scoped: services.AddScoped(type); break;
  90. case ServiceLifetime.Transient: services.AddTransient(type); break;
  91. }
  92. }
  93. else
  94. {
  95. //服务继承自接口的和接口一起注入
  96. switch (type.GetCustomAttribute<ServiceInjectAttribute>().Lifetime)
  97. {
  98. case ServiceLifetime.Singleton: services.AddSingleton(typeInterface, type); break;
  99. case ServiceLifetime.Scoped: services.AddScoped(typeInterface, type); break;
  100. case ServiceLifetime.Transient: services.AddTransient(typeInterface, type); break;
  101. }
  102. }
  103. }
  104. }
  105. /// <summary>
  106. /// 注册后台服务
  107. /// </summary>
  108. /// <param name="services"></param>
  109. private static void RegisterBackgroundService(this IServiceCollection services, IEnumerable<Assembly> assemblies)
  110. {
  111. var types = assemblies.SelectMany(t => t.GetTypes()).Where(t => typeof(BackgroundService).IsAssignableFrom(t) && !t.IsAbstract);
  112. foreach (var type in types)
  113. {
  114. services.AddSingleton(typeof(IHostedService), type);
  115. }
  116. }
  117. }
  118. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface)]
  119. public class ServiceInjectAttribute : Attribute
  120. {
  121. public ServiceInjectAttribute()
  122. {
  123. }
  124. public ServiceInjectAttribute(ServiceLifetime lifetime)
  125. {
  126. Lifetime = lifetime;
  127. }
  128. public ServiceLifetime Lifetime { get; set; } = ServiceLifetime.Transient;
  129. }