StartupExtensions.cs 10 KB

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