PathServiceInitializer.cs
2.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Rcs.Application.Services;
using Rcs.Infrastructure.PathFinding.Services;
namespace Rcs.Infrastructure.PathFinding
{
/// <summary>
/// 寻路服务初始化器 - 应用启动时自动初始化合并映射和逆向边关系
/// @author zzy
/// </summary>
public class PathServiceInitializer : IHostedService
{
private readonly ILogger<PathServiceInitializer> _logger;
private readonly IMapMappingService _mapMappingService;
private readonly IUnifiedTrafficControlService _unifiedTrafficControlService;
public PathServiceInitializer(
ILogger<PathServiceInitializer> logger,
IMapMappingService mapMappingService,
IUnifiedTrafficControlService unifiedTrafficControlService)
{
_logger = logger;
_mapMappingService = mapMappingService;
_unifiedTrafficControlService = unifiedTrafficControlService;
}
public async Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("开始初始化寻路服务...");
try
{
// 1. 初始化地图合并映射(从Redis加载所有地图,按MapCode分组合并)
var mergedTopologies = await _mapMappingService.InitializeAllMappingsAsync();
if (mergedTopologies.Count == 0)
{
_logger.LogWarning("未找到任何地图数据,寻路服务初始化完成但无可用地图");
return;
}
// 2. 从合并映射初始化逆向边关系(用于双向互斥检测)
await _unifiedTrafficControlService.InitializeFromMergedMappingsAsync(mergedTopologies);
_logger.LogInformation("寻路服务初始化完成: {MapCodeCount} 个MapCode分组已加载", mergedTopologies.Count);
}
catch (Exception ex)
{
_logger.LogError(ex, "寻路服务初始化失败");
// 不抛出异常,允许应用继续启动,后续可以手动重试初始化
}
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("寻路服务已停止");
return Task.CompletedTask;
}
}
}