StartupExtensions.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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.YbEnterprise.Sdk;
  23. namespace Hotline.Api;
  24. internal static class StartupExtensions
  25. {
  26. const string CorsOrigins = "CorsOrigins";
  27. internal static WebApplication ConfigureServices(this WebApplicationBuilder builder)
  28. {
  29. var services = builder.Services;
  30. var configuration = builder.Configuration;
  31. services.AddHttpContextAccessor();
  32. #if DEBUG
  33. builder.WebHost.UseUrls("http://*:50100");
  34. #endif
  35. //services.Configure<DeviceConfigs>(d => configuration.GetSection(nameof(DeviceConfigs)).Bind(d));
  36. services.Configure<IdentityConfiguration>(d => configuration.GetSection(nameof(IdentityConfiguration)).Bind(d));
  37. services.Configure<CallCenterConfiguration>(d => configuration.GetSection(nameof(CallCenterConfiguration)).Bind(d));
  38. services.Configure<AiVisitConfig>(d => configuration.GetSection("AiVisit").Bind(d));
  39. // Add services to the container.
  40. services
  41. .BatchInjectServices()
  42. .RegisterRepository()
  43. .AddApplication()
  44. //.AddClientCore(configuration)
  45. //.AddScoped<IPasswordHasher<Account>, PasswordHasher<Account>>()
  46. .AddScoped(typeof(IPasswordHasher<>), typeof(PasswordHasher<>))
  47. ;
  48. //cache
  49. services.AddCache(d =>
  50. {
  51. var cacheConfig = configuration.GetSection("Cache").Get<CacheOptions>();
  52. cacheConfig.Adapt(d);
  53. d.Prefix = "Hotline";
  54. d.TopicName = "hotline-topic";
  55. });
  56. //Authentication
  57. services.RegisterAuthentication(configuration);
  58. services.AddControllers(options =>
  59. {
  60. options.Filters.Add<UnifyResponseFilter>();
  61. options.Filters.Add<UserFriendlyExceptionFilter>();
  62. })
  63. ;
  64. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  65. services.AddEndpointsApiExplorer();
  66. //swagger
  67. services.RegisterSwagger();
  68. //signalR
  69. services.RegisterSignalR(configuration);
  70. /* CORS */
  71. services.RegisterCors(configuration, CorsOrigins);
  72. //mapster
  73. services.RegisterMapper();
  74. //mediatr
  75. services.AddMediatR(d =>
  76. {
  77. d.RegisterServicesFromAssembly(typeof(ApplicationStartupExtensions).Assembly);
  78. });
  79. var callCenterConfiguration = configuration.GetSection("CallCenterConfiguration").Get<CallCenterConfiguration>();
  80. //迅时IPPBX
  81. services.AddNewRock(callCenterConfiguration.DeviceConfigs.Address);
  82. ////wex
  83. //services.AddWex(callCenterConfiguration.Wex.Address);
  84. //tr
  85. var trConfig = configuration.GetRequiredSection("Tr").Get<TrConfiguration>();
  86. services.AddTrSdk(trConfig.Address, trConfig.Username, trConfig.Password);
  87. //jths
  88. services.AddAiJths(configuration.GetSection("AiQuality").Get<AiQualityConfig>().Url);
  89. //宜宾企业服务
  90. services.Configure<EnterpriseConfig>(d => configuration.GetSection("Enterprise").Bind(d));
  91. var enterpriseConfig = configuration.GetSection("Enterprise").Get<EnterpriseConfig>();
  92. services.AddYbEnterpriseSdk(enterpriseConfig?.AddressUrl);
  93. var aiVisitConfig = configuration.GetSection("AiVisit").Get<AiVisitConfig>();
  94. services.AddAiVisitService(aiVisitConfig.Url, aiVisitConfig.Appkey, aiVisitConfig.ServiceVersion, aiVisitConfig.SceneUid, aiVisitConfig.RuleUid,aiVisitConfig.VisitFromNameKey,aiVisitConfig.VisitFromGenderKey,aiVisitConfig.VisitCreationTimeKey,aiVisitConfig.VisitOrderTitleKey);
  95. //sqlsugar
  96. services.AddSqlSugar(configuration);
  97. //services.AddWexDb(configuration);
  98. //validator
  99. services.AddFluentValidationAutoValidation(config =>
  100. {
  101. config.DisableDataAnnotationsValidation = true;
  102. })
  103. .AddValidatorsFromAssembly(typeof(AppContractsStartupExtensions).Assembly);
  104. // //mq
  105. // services.AddMq(configuration);
  106. services.AddSingleton<IAuthorizationPolicyProvider, AuthorizationPolicyProvider>();
  107. services.AddSingleton<IAuthorizationHandler, PermissionHandler>();
  108. //services.AddScoped<LogFilterAttribute>();
  109. return builder.Build();
  110. }
  111. internal static WebApplication ConfigurePipelines(this WebApplication app)
  112. {
  113. app.UseSerilogRequestLogging();
  114. // Configure the HTTP request pipeline.
  115. var swaggerEnable = app.Configuration.GetSection("Swagger").Get<bool>();
  116. if (swaggerEnable)
  117. {
  118. app.UseSwagger();
  119. app.UseSwaggerUI(c =>
  120. {
  121. //c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
  122. });
  123. }
  124. app.UseCors(CorsOrigins);
  125. app.UseAuthentication();
  126. app.UseAuthorization();
  127. //app.MapHub<CallCenterHub>("/hubs/callcenter");
  128. app.MapHub<HotlineHub>("/hubs/hotline");
  129. app.MapControllers()
  130. .RequireAuthorization();
  131. //app.MapSubscribeHandler();
  132. return app;
  133. }
  134. }