StartupExtensions.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. using FluentValidation;
  2. using FluentValidation.AspNetCore;
  3. using Hotline.Api.Realtimes;
  4. using Hotline.Application;
  5. using Hotline.Application.Contracts;
  6. using Hotline.CallCenter.Devices;
  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.YbEnterprise.Sdk;
  24. using Hotline.Share.Dtos.SendSms;
  25. using Hotline.Wex;
  26. using Hotline.Application.CallCenter.Calls;
  27. using Hotline.Application.CallCenter;
  28. using Hotline.CallCenter.Calls;
  29. namespace Hotline.Api;
  30. internal static class StartupExtensions
  31. {
  32. const string CorsOrigins = "CorsOrigins";
  33. internal static WebApplication ConfigureServices(this WebApplicationBuilder builder)
  34. {
  35. var services = builder.Services;
  36. var configuration = builder.Configuration;
  37. services.AddHttpContextAccessor();
  38. #if DEBUG
  39. builder.WebHost.UseUrls("http://*:50100");
  40. #endif
  41. services.Configure<IdentityConfiguration>(d => configuration.GetSection(nameof(IdentityConfiguration)).Bind(d));
  42. services.Configure<CallCenterConfiguration>(d => configuration.GetSection(nameof(CallCenterConfiguration)).Bind(d));
  43. services.Configure<AiVisitConfig>(d => configuration.GetSection("AiVisit").Bind(d));
  44. services.Configure<SendSmsConfiguration>(d => configuration.GetSection("SendSms").Bind(d));
  45. // Add services to the container.
  46. services
  47. .BatchInjectServices()
  48. .RegisterRepository()
  49. .AddApplication()
  50. //.AddClientCore(configuration)
  51. //.AddScoped<IPasswordHasher<Account>, PasswordHasher<Account>>()
  52. .AddScoped(typeof(IPasswordHasher<>), typeof(PasswordHasher<>))
  53. ;
  54. //cache
  55. services.AddCache(d =>
  56. {
  57. var cacheConfig = configuration.GetSection("Cache").Get<CacheOptions>();
  58. cacheConfig.Adapt(d);
  59. d.Prefix = "Hotline";
  60. d.TopicName = "hotline-topic";
  61. });
  62. //Authentication
  63. services.RegisterAuthentication(configuration);
  64. services.AddControllers(options =>
  65. {
  66. options.Filters.Add<UnifyResponseFilter>();
  67. options.Filters.Add<UserFriendlyExceptionFilter>();
  68. })
  69. ;
  70. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  71. services.AddEndpointsApiExplorer();
  72. //swagger
  73. services.RegisterSwagger();
  74. //signalR
  75. services.RegisterSignalR(configuration);
  76. /* CORS */
  77. services.RegisterCors(configuration, CorsOrigins);
  78. //mapster
  79. services.RegisterMapper();
  80. //mediatr
  81. services.AddMediatR(d =>
  82. {
  83. d.RegisterServicesFromAssembly(typeof(ApplicationStartupExtensions).Assembly);
  84. });
  85. //callcenter
  86. var callCenterConfiguration = configuration
  87. .GetRequiredSection(nameof(CallCenterConfiguration))
  88. .Get<CallCenterConfiguration>();
  89. services.AddNewRock(callCenterConfiguration.NewRock);
  90. switch (callCenterConfiguration.CallCenterType)
  91. {
  92. case "XunShi":
  93. break;
  94. case "WerErXin":
  95. services
  96. .AddWex(callCenterConfiguration.Wex)
  97. .AddWexDb(configuration);
  98. break;
  99. case "TianRun":
  100. services
  101. .AddScoped<ICallApplication, TianRunCallApplication>()
  102. .AddScoped<ITrApplication, TrApplication>()
  103. .AddHostedService<CurrentWaitNumService>()
  104. .AddHostedService<TelsStatusRefreshService>()
  105. .AddTrSdk(callCenterConfiguration.TianRun.Address,
  106. callCenterConfiguration.TianRun.Username,
  107. callCenterConfiguration.TianRun.Password);
  108. break;
  109. case "XingTang":
  110. services.AddXingTangDb(callCenterConfiguration.XingTang)
  111. .AddScoped<ICallApplication, XingTangCallApplication>()
  112. .AddScoped<CallIdManager>()
  113. ;
  114. break;
  115. default:
  116. break;
  117. }
  118. ////tr
  119. //var trConfig = configuration.GetRequiredSection("Tr").Get<TianrunConfiguration>();
  120. //jths
  121. services.AddAiJths(configuration.GetSection("AiQuality").Get<AiQualityConfig>().Url);
  122. //宜宾企业服务
  123. services.Configure<EnterpriseConfig>(d => configuration.GetSection("Enterprise").Bind(d));
  124. var enterpriseConfig = configuration.GetSection("Enterprise").Get<EnterpriseConfig>();
  125. services.AddYbEnterpriseSdk(enterpriseConfig?.AddressUrl);
  126. var aiVisitConfig = configuration.GetSection("AiVisit").Get<AiVisitConfig>();
  127. services.AddAiVisitService(
  128. aiVisitConfig.Url,
  129. aiVisitConfig.Appkey,
  130. aiVisitConfig.ServiceVersion);
  131. //sqlsugar
  132. services.AddSqlSugar(configuration);
  133. //validator
  134. services.AddFluentValidationAutoValidation(config =>
  135. {
  136. config.DisableDataAnnotationsValidation = true;
  137. })
  138. .AddValidatorsFromAssembly(typeof(AppContractsStartupExtensions).Assembly);
  139. //mq
  140. services.AddMq(configuration);
  141. //job
  142. services.RegisterJob(callCenterConfiguration);
  143. services.AddSingleton<IAuthorizationPolicyProvider, AuthorizationPolicyProvider>();
  144. services.AddSingleton<IAuthorizationHandler, PermissionHandler>();
  145. //services.AddScoped<LogFilterAttribute>();
  146. return builder.Build();
  147. }
  148. internal static WebApplication ConfigurePipelines(this WebApplication app)
  149. {
  150. app.UseSerilogRequestLogging();
  151. // Configure the HTTP request pipeline.
  152. var swaggerEnable = app.Configuration.GetSection("Swagger").Get<bool>();
  153. if (swaggerEnable)
  154. {
  155. app.UseSwagger();
  156. app.UseSwaggerUI(c =>
  157. {
  158. //c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
  159. });
  160. }
  161. app.UseCors(CorsOrigins);
  162. app.UseAuthentication();
  163. app.UseAuthorization();
  164. //app.MapHub<CallCenterHub>("/hubs/callcenter");
  165. app.MapHub<HotlineHub>("/hubs/hotline");
  166. app.MapControllers()
  167. .RequireAuthorization();
  168. //app.MapSubscribeHandler();
  169. return app;
  170. }
  171. }