StartupExtensions.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. using System.Reflection;
  2. using FluentValidation;
  3. using FluentValidation.AspNetCore;
  4. using Hotline.Api.Realtimes;
  5. using Hotline.Application;
  6. using Hotline.Application.Contracts;
  7. using Hotline.NewRock;
  8. using Hotline.Permissions;
  9. using Hotline.Repository.SqlSugar.Extensions;
  10. using Microsoft.AspNetCore.Authorization;
  11. using Microsoft.AspNetCore.Identity;
  12. using Serilog;
  13. using Mapster;
  14. using Tr.Sdk;
  15. using XF.Domain.Dependency;
  16. using XF.Domain.Filters;
  17. using XF.Domain.Options;
  18. using XF.EasyCaching;
  19. using XF.Utility.MQ;
  20. using Hotline.Ai.Jths;
  21. using Hotline.Api.Sdk;
  22. using Hotline.CallCenter.Configs;
  23. using Hotline.Wex;
  24. using Hotline.Application.CallCenter.Calls;
  25. using Hotline.Application.CallCenter;
  26. using Hotline.Authentications;
  27. using Hotline.CallCenter.Calls;
  28. using Swashbuckle.AspNetCore.SwaggerUI;
  29. using Hotline.Configurations;
  30. using Hotline.DI;
  31. using Hotline.Share.Tools;
  32. using Hotline.Settings.TimeLimitDomain.ExpireTimeSupplier;
  33. using Hotline.Api.Middleware;
  34. using XF.Domain.Authentications;
  35. using Hotline.XingTang;
  36. namespace Hotline.Api;
  37. internal static class StartupExtensions
  38. {
  39. const string CorsOrigins = "CorsOrigins";
  40. internal static WebApplication ConfigureServices(this WebApplicationBuilder builder)
  41. {
  42. var services = builder.Services;
  43. var configuration = builder.Configuration;
  44. services.AddHttpContextAccessor();
  45. #if DEBUG
  46. builder.WebHost.UseUrls("http://*:50100");
  47. #endif
  48. services.Configure<IdentityConfiguration>(d => configuration.GetSection(nameof(IdentityConfiguration)).Bind(d));
  49. var appConfigurationSection = configuration.GetRequiredSection(nameof(AppConfiguration));
  50. var appConfiguration = appConfigurationSection.Get<AppConfiguration>();
  51. if (appConfiguration is null) throw new ArgumentNullException(nameof(appConfiguration));
  52. services.Configure<AppConfiguration>(d => appConfigurationSection.Bind(d));
  53. var callCenterConfigurationSection = configuration.GetRequiredSection(nameof(CallCenterConfiguration));
  54. var callCenterConfiguration = callCenterConfigurationSection.Get<CallCenterConfiguration>();
  55. services.Configure<CallCenterConfiguration>(d => callCenterConfigurationSection.Bind(d));
  56. services.Configure<CityBaseConfiguration>(d => configuration.GetSection(nameof(CityBaseConfiguration)).Bind(d));
  57. //services.Configure<SendSmsConfiguration>(d => configuration.GetSection("SendSms").Bind(d));
  58. // Add services to the container.
  59. services
  60. .BatchInjectServices(d =>
  61. {
  62. var attr = d.GetCustomAttribute(typeof(InjectionAttribute)) as InjectionAttribute;
  63. if (attr is null) return true;
  64. return attr.IsEnable(appConfiguration.AppScope,
  65. appConfiguration.GetDefaultAppScopeConfiguration().CallCenterType);
  66. })
  67. .RegisterRepository()
  68. .AddApplication()
  69. .AddScoped(typeof(IPasswordHasher<>), typeof(PasswordHasher<>))
  70. .AddHttpClient()
  71. ;
  72. services.AddKeyedScoped<ISessionContext, ProvinceSessionContext>(ProvinceSessionContext.Key)
  73. .AddKeyedScoped<ISessionContext, Police110SessionContext>(Police110SessionContext.Key)
  74. ;
  75. //cache
  76. services.AddCache(d =>
  77. {
  78. var cacheConfig = configuration.GetSection("Cache").Get<CacheOptions>();
  79. cacheConfig.Adapt(d);
  80. d.Prefix = "Hotline";
  81. d.TopicName = "hotline-topic";
  82. });
  83. //Authentication
  84. services.RegisterAuthentication(configuration);
  85. services.AddControllers(options =>
  86. {
  87. options.Filters.Add<UnifyResponseFilter>();
  88. options.Filters.Add<UserFriendlyExceptionFilter>();
  89. })
  90. ;
  91. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  92. services.AddEndpointsApiExplorer();
  93. //swagger
  94. services.RegisterSwagger();
  95. //signalR
  96. services.RegisterSignalR(configuration);
  97. /* CORS */
  98. services.RegisterCors(configuration, CorsOrigins);
  99. //mapster
  100. services.RegisterMapper();
  101. //mediatr
  102. services.RegisterMediatR(appConfiguration);
  103. //app scope
  104. switch (appConfiguration.AppScope)
  105. {
  106. case AppDefaults.AppScope.YiBin:
  107. //jths
  108. services.AddAiJths(appConfiguration.YiBin.AiQuality.Url);
  109. services.AddAiVisitService(
  110. appConfiguration.YiBin.AiVisit.Url,
  111. appConfiguration.YiBin.AiVisit.Appkey,
  112. appConfiguration.YiBin.AiVisit.ServiceVersion);
  113. //宜宾企业服务
  114. services.AddYbEnterpriseSdk(appConfiguration.YiBin.Enterprise.AddressUrl)
  115. .AddKeyedScoped<ISessionContext, YbEnterpriseSessionContext>(YbEnterpriseSessionContext.Key)
  116. .AddKeyedScoped<ISessionContext, ZzptSessionContext>(ZzptSessionContext.Key);
  117. break;
  118. case AppDefaults.AppScope.ZiGong:
  119. break;
  120. case AppDefaults.AppScope.LuZhou:
  121. break;
  122. }
  123. //callcenter
  124. var callcenterType = appConfiguration.GetDefaultAppScopeConfiguration().CallCenterType;
  125. switch (callcenterType)
  126. {
  127. case AppDefaults.CallCenterType.XunShi:
  128. services.AddNewRock(callCenterConfiguration.NewRock);
  129. break;
  130. case AppDefaults.CallCenterType.WeiErXin:
  131. services
  132. .AddWex(callCenterConfiguration.Wex)
  133. .AddWexDb(configuration);
  134. break;
  135. case AppDefaults.CallCenterType.TianRun:
  136. services
  137. .AddScoped<ICallApplication, TianRunCallApplication>()
  138. .AddScoped<ITrApplication, TrApplication>()
  139. .AddHostedService<CurrentWaitNumService>()
  140. .AddHostedService<TelsStatusRefreshService>()
  141. .AddTrSdk(callCenterConfiguration.TianRun.Address,
  142. callCenterConfiguration.TianRun.Username,
  143. callCenterConfiguration.TianRun.Password);
  144. break;
  145. case AppDefaults.CallCenterType.XingTang:
  146. services.AddXingTangDb(callCenterConfiguration.XingTang)
  147. .AddXingTangSDK()
  148. .AddScoped<ICallApplication, XingTangCallApplication>()
  149. .AddScoped<CallIdManager>()
  150. ;
  151. break;
  152. default:
  153. break;
  154. }
  155. //sqlsugar
  156. services.AddSqlSugar(configuration);
  157. //validator
  158. services.AddFluentValidationAutoValidation(config =>
  159. {
  160. config.DisableDataAnnotationsValidation = true;
  161. })
  162. .AddValidatorsFromAssembly(typeof(AppContractsStartupExtensions).Assembly);
  163. //mq
  164. services.AddMq(configuration);
  165. //job
  166. services.RegisterJob(appConfiguration);
  167. services.AddSingleton<IAuthorizationPolicyProvider, AuthorizationPolicyProvider>();
  168. services.AddSingleton<IAuthorizationHandler, PermissionHandler>();
  169. services.AddScoped<ExpireTimeFactory>();
  170. services.AddScoped<IExpireTimeSupplier, DaySupplier>();
  171. services.AddScoped<IExpireTimeSupplier, WorkDaySupplier>();
  172. services.AddScoped<IExpireTimeSupplier, HourSupplier>();
  173. //services.AddScoped<LogFilterAttribute>();
  174. //ServiceLocator.Instance = services.BuildServiceProvider();
  175. return builder.Build();
  176. }
  177. internal static WebApplication ConfigurePipelines(this WebApplication app)
  178. {
  179. app.UseSerilogRequestLogging();
  180. // Configure the HTTP request pipeline.
  181. var swaggerEnable = app.Configuration.GetSection("Swagger").Get<bool>();
  182. if (swaggerEnable)
  183. {
  184. app.UseSwagger();
  185. app.UseSwaggerUI(c =>
  186. {
  187. //c.DocExpansion(DocExpansion.None);
  188. //c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
  189. });
  190. }
  191. app.UseCors(CorsOrigins);
  192. app.UseAuthentication();
  193. app.UseAuthorization();
  194. //app.MapHub<CallCenterHub>("/hubs/callcenter");
  195. app.MapHub<HotlineHub>("/hubs/hotline");
  196. app.MapControllers()
  197. .RequireAuthorization();
  198. //app.MapSubscribeHandler();
  199. // 为特定返回结果添加 头部信息 的中间件
  200. app.UseMiddleware<HeaderMiddleware>();
  201. return app;
  202. }
  203. }