using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Configuration; using Polly; using Polly.Extensions.Http; using Prism.Ioc; using Prism.Modularity; using System.Net.Http; using YY.Admin.Core.Services; using YY.Admin.Infrastructure.Hubs; using YY.Admin.Infrastructure.Network; using YY.Admin.Infrastructure.Storage; using YY.Admin.Infrastructure.Sync; namespace YY.Admin.Module; public class SyncModule : IModule { public void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterSingleton(); containerRegistry.RegisterSingleton(); containerRegistry.RegisterSingleton(); containerRegistry.RegisterSingleton(); containerRegistry.RegisterSingleton(); containerRegistry.RegisterSingleton(); var serviceCollection = new ServiceCollection(); serviceCollection.AddHttpClient("JeecgApi", (sp, client) => { var config = containerRegistry.GetContainer().Resolve(); var baseUrl = config.GetValue("JeecgIntegration:BaseUrl")?.TrimEnd('/'); if (!string.IsNullOrWhiteSpace(baseUrl)) { client.BaseAddress = new Uri(baseUrl); } var tokenStore = containerRegistry.GetContainer().Resolve(); var token = tokenStore.GetTokenAsync(default).ConfigureAwait(false).GetAwaiter().GetResult(); if (!string.IsNullOrWhiteSpace(token)) { client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token); } }).AddPolicyHandler(GetRetryPolicy()); var provider = serviceCollection.BuildServiceProvider(); var httpClientFactory = provider.GetRequiredService(); containerRegistry.RegisterInstance(httpClientFactory); } public void OnInitialized(IContainerProvider containerProvider) { var networkMonitor = containerProvider.Resolve(); var outboxProcessor = containerProvider.Resolve(); var signalService = containerProvider.Resolve(); _ = networkMonitor.StartAsync(CancellationToken.None); _ = outboxProcessor.StartConsumerAsync(CancellationToken.None); // 用户镜像 + 设备指令:统一 STOMP(/ws/device),免密与设备 Token 模式均启动 _ = Task.Run(() => signalService.ConnectUnifiedDeviceChannelAsync(CancellationToken.None)); } private static IAsyncPolicy GetRetryPolicy() { return HttpPolicyExtensions .HandleTransientHttpError() .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); } }