No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

252 líneas
10KB

  1. using AspectCore.Extensions.DependencyInjection;
  2. using HealthMonitor.Common;
  3. using HealthMonitor.Common.helper;
  4. using HealthMonitor.Core.Cache;
  5. using HealthMonitor.Core.Context;
  6. using HealthMonitor.Core.Dal.EfCoreImpl;
  7. using HealthMonitor.Core.Dal;
  8. using HealthMonitor.Core.Dal.Factory;
  9. using HealthMonitor.Core.DbLog;
  10. using HealthMonitor.Core.Operator;
  11. using HealthMonitor.Core.Operator.Redis;
  12. using HealthMonitor.Model.Config;
  13. using HealthMonitor.Service.Biz.db;
  14. using HealthMonitor.WebApi.Configs;
  15. using HealthMonitor.WebApi.DbLog;
  16. using Microsoft.AspNetCore.Mvc;
  17. using Microsoft.EntityFrameworkCore;
  18. using Microsoft.Extensions.Configuration;
  19. using Microsoft.Extensions.DependencyInjection;
  20. using Microsoft.Extensions.Options;
  21. using Microsoft.OpenApi.Models;
  22. using HealthMonitor.WebApi.Swagger;
  23. using HealthMonitor.Service.Cache;
  24. using TelpoDataService.Util.Clients;
  25. using HealthMonitor.Service.Sub;
  26. namespace HealthMonitor.WebApi
  27. {
  28. public class Program
  29. {
  30. public static void Main(string[] args)
  31. {
  32. var builder = WebApplication.CreateBuilder(args);
  33. // Add services to the container.
  34. builder.Services.AddHttpClient(Consts.DEFAULT_HTTPCLIENT_NAME, c =>
  35. {
  36. c.Timeout = TimeSpan.FromSeconds(10); //超时限制
  37. c.DefaultRequestHeaders.Add("Accept", "application/json");
  38. //c.DefaultRequestHeaders.Connection.Add("keep-alive");
  39. });
  40. // builder.Services.Configure<TDengineServiceConfig>(builder.Configuration.GetSection("TDengineServiceConfig"));
  41. builder.Services.AddSingleton<HttpHelper>();
  42. builder.Services.AddSingleton<TDengineService>();
  43. builder.Services.AddControllers();
  44. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  45. builder.Services.AddEndpointsApiExplorer();
  46. builder.Services.AddSwaggerGen();
  47. #region scoped MySQL 数据库
  48. builder.Services // gps_card
  49. .AddDbContextPool<GpsCardContext>((sp, options) =>
  50. {
  51. var loggerFactory = sp.GetRequiredService<EfCoreLoggerFactory>();
  52. var mySqlCon = builder.Configuration.GetConnectionString("GpsCard_Connection_String");
  53. var serverVersion = ServerVersion.AutoDetect(mySqlCon);
  54. options.UseMySql(mySqlCon, serverVersion)
  55. .UseLoggerFactory(loggerFactory);
  56. }, poolSize: 64) // health_monitor
  57. .AddDbContextPool<HealthMonitorContext>((sp, options) =>
  58. {
  59. var loggerFactory = sp.GetRequiredService<EfCoreLoggerFactory>();
  60. var mySqlCon = builder.Configuration.GetConnectionString("HealthMonitor_Connection_String");
  61. var serverVersion = ServerVersion.AutoDetect(mySqlCon);
  62. options.UseMySql(mySqlCon, serverVersion)
  63. .UseLoggerFactory(loggerFactory);
  64. }, poolSize: 64); ;
  65. builder.Services
  66. .AddScoped<IGpsCardDataAccessor, EfCoreDataAccessor>(sp =>
  67. {
  68. var context = sp.GetRequiredService<GpsCardContext>();
  69. return new EfCoreDataAccessor(context);
  70. })
  71. .AddScoped<IHealthMonitorDataAccessor, EfCoreDataAccessor>(sp =>
  72. {
  73. var context = sp.GetRequiredService<HealthMonitorContext>();
  74. return new EfCoreDataAccessor(context);
  75. });
  76. //builder.Services.AddDbContextPool<HealthMonitorContext>((sp, options) =>
  77. //{
  78. // var loggerFactory = sp.GetRequiredService<EfCoreLoggerFactory>();
  79. // options.UseMySql(builder.Configuration.GetConnectionString("GpsCard_Connection_String"))
  80. // .UseLoggerFactory(loggerFactory);
  81. //}, poolSize: 64);
  82. //builder.Services.AddScoped<IHealthMonitorDataAccessor, EfCoreDataAccessor>(sp =>
  83. //{
  84. // var context = sp.GetRequiredService<HealthMonitorContext>();
  85. // return new EfCoreDataAccessor(context);
  86. //});
  87. #endregion
  88. #region AOP
  89. //builder.Services.Configure<RedisConfig>(builder.Configuration.GetSection("Redis"));
  90. builder.Services
  91. .Configure<ApiBehaviorOptions>(options =>
  92. {
  93. options.SuppressModelStateInvalidFilter = true;
  94. })
  95. .Configure<RedisConfig>(builder.Configuration.GetSection("Redis"))
  96. .Configure<TDengineServiceConfig>(builder.Configuration.GetSection("TDengineServiceConfig"))
  97. .Configure<ServiceConfig>(builder.Configuration.GetSection("ServiceConfig"));
  98. builder.Services
  99. .AddSingleton<IEfCoreLoggerProvider, EfCoreLogProvider>()
  100. .AddSingleton<IDurableEntityManager, DurableEntityManager>()
  101. .AddSingleton<EfCoreLoggerFactory>(sp =>
  102. {
  103. var provider = sp.GetRequiredService<IEfCoreLoggerProvider>();
  104. return new EfCoreLoggerFactory(new[] { provider });
  105. });
  106. //builder.Services.AddSingleton<IDurableEntityManager, DurableEntityManager>();
  107. //builder.Services.AddSingleton<EfCoreLoggerFactory>(sp =>
  108. //{
  109. // var provider = sp.GetRequiredService<IEfCoreLoggerProvider>();
  110. // return new EfCoreLoggerFactory(new[] { provider });
  111. //});
  112. builder.Services
  113. .AddSingleton<GpsCardAccessorFactory>()
  114. .AddSingleton<HealthMonitorAccessorFactory>();
  115. //builder.Services.AddSingleton<HealthMonitorAccessorFactory>();
  116. builder.Services
  117. .AddSingleton<IGpsCardOperatorManager, GpsCardOperatorRedisManager>()
  118. .AddSingleton<IHealthMonitorOperatorManager, HealthMonitorOperatorRedisManager>();
  119. //builder.Services.AddSingleton<IHealthMonitorOperatorManager, HealthMonitorOperatorRedisManager>();
  120. //用AspectCore替换默认的IOC容器
  121. builder.Host.UseServiceProviderFactory(new DynamicProxyServiceProviderFactory());
  122. #endregion
  123. #region Cache
  124. builder.Services
  125. .AddSingleton<PersonCacheManager>()
  126. .AddSingleton<BloodPressReferenceValueCacheManager>();
  127. #endregion
  128. #region TelpoDataServices
  129. builder.Services.AddTelpoDataServices(opt =>
  130. {
  131. opt.TelpoDataUrl = builder.Configuration.GetSection("ServiceConfig:TelpoDataUrl").Value;
  132. });
  133. #endregion
  134. #region Worker
  135. builder.Services
  136. .AddSingleton<TDengineDataSubcribe>()
  137. .AddHostedService<Worker>();
  138. #endregion
  139. // Register the Swagger generator, defining 1 or more Swagger documents
  140. builder.Services.AddSwaggerGen(c =>
  141. {
  142. c.SwaggerDoc(AppConsts.SWAGGER_DOC_GpsCard, new OpenApiInfo { Title = "GpsCard模块", Version = "v1", Description = "gps_card数据库服务" }); //分组显示
  143. c.SwaggerDoc(AppConsts.SWAGGER_DOC_HealthMonitor, new OpenApiInfo { Title = "HealthMonitor模块", Version = "v1", Description = "health_monitor数据库服务" }); //分组显示
  144. c.DocumentFilter<EnumDocumentFilter>();
  145. //var utilXmlFile = Path.Combine(AppContext.BaseDirectory, "HealthMonitor.Util.xml");
  146. //var webapiXmlFile = Path.Combine(AppContext.BaseDirectory, "HealthMonitor.WebApi.xml");
  147. //c.IncludeXmlComments(utilXmlFile, true);
  148. //c.IncludeXmlComments(webapiXmlFile, true);
  149. });
  150. var app = builder.Build();
  151. // Configure the HTTP request pipeline.
  152. //if (app.Environment.IsDevelopment())
  153. //{
  154. // app.UseSwagger();
  155. // app.UseSwaggerUI();
  156. //}
  157. string prefix = string.Empty;
  158. //if (!app.Environment.IsDebugOrDevelop())
  159. //{
  160. // prefix = optConfigAppSettings.Value.NginxPrefix;
  161. // if (string.IsNullOrWhiteSpace(prefix)) prefix = SERVICE_PREFIX;
  162. //}
  163. // Enable middleware to serve generated Swagger as a JSON endpoint.
  164. app.UseSwagger(c =>
  165. {
  166. c.PreSerializeFilters.Add((swagger, httpReq) =>
  167. {
  168. var scheme = httpReq.Headers.TryGetValue("X-Forwarded-Proto", out var v2) ? v2.ToString() : httpReq.Scheme;
  169. swagger.Servers = new List<OpenApiServer> { new OpenApiServer { Url = $"{scheme}://{httpReq.Host}/{prefix}" } };
  170. });
  171. c.RouteTemplate = "/{documentName}/api-docs/";
  172. });
  173. // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
  174. // specifying the Swagger JSON endpoint.
  175. app.UseSwaggerUI(c =>
  176. {
  177. string sub = string.IsNullOrEmpty(prefix) ? "" : $"/{prefix}";
  178. c.SwaggerEndpoint($"{sub}/{AppConsts.SWAGGER_DOC_GpsCard}/api-docs/", "GpsCard模块"); //分组显示
  179. c.SwaggerEndpoint($"{sub}/{AppConsts.SWAGGER_DOC_HealthMonitor}/api-docs/", "HealthMonitor模块"); //分组显示
  180. c.RoutePrefix = string.Empty;
  181. });
  182. // redis default
  183. var csredis = new CSRedis.CSRedisClient(app.Services.GetService<IOptions<RedisConfig>>()!.Value.ToString());
  184. RedisHelper.Initialization(csredis);
  185. // redis db7
  186. var csredisDb7Con = app.Services.GetService<IOptions<RedisConfig>>()!.Value;
  187. csredisDb7Con.DefaultDatabase = 7;
  188. csredisDb7Con.Prefix = "TELPO";
  189. var csredisDb7 = new CSRedis.CSRedisClient(csredisDb7Con.ToString());
  190. RedisHelperDb7.Initialization(csredisDb7);
  191. app.UseHttpsRedirection();
  192. app.UseAuthorization();
  193. app.MapControllers();
  194. app.Run();
  195. }
  196. }
  197. }