StartupExtensions.cs 9.5 KB

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