using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.HttpEnum;
using WIDESEAWCS_Core.Caches;
namespace WIDESEAWCS_Server.HostedService
{
///
/// Preloads API route mappings into cache at application startup.
///
public class ApiRouteCacheWarmupHostedService : IHostedService
{
private static readonly (string ConfigKey, string RoutePath)[] ApiRouteMappings =
{
(nameof(ConfigKey.CreateTaskInboundAsync), "Task/CreateTaskInbound"),
(nameof(ConfigKey.GetTasksLocation), "Task/GetTasksLocation"),
(nameof(ConfigKey.OutboundFinishTaskAsync), "Task/OutboundFinishTask"),
(nameof(ConfigKey.InboundFinishTaskAsync), "Task/InboundFinishTask"),
(nameof(ConfigKey.GetOutBoundTrayTaskAsync), "Task/GetOutBoundTrayTask"),
(nameof(ConfigKey.CreateTaskInboundTrayAsync), "Task/CreateTaskInboundTray"),
(nameof(ConfigKey.GroupPalletAsync), "Stock/GroupPalletAsync"),
(nameof(ConfigKey.ChangePalletAsync), "Stock/ChangePalletAsync"),
(nameof(ConfigKey.SplitPalletAsync), "Stock/SplitPalletAsync"),
(nameof(ConfigKey.UpdateTaskByStatus), "Task/UpdateTaskByStatus"),
(nameof(ConfigKey.TransferCheck), "LocationInfo/TransferCheck"),
(nameof(ConfigKey.RelocationFinishTask), "Task/RelocationFinishTask"),
(nameof(ConfigKey.CreateRobotGroupPalletTask), "Task/CreateRobotGroupPalletTask"),
(nameof(ConfigKey.CreateRobotChangePalletTask), "Task/CreateRobotChangePalletTask"),
(nameof(ConfigKey.CreateRobotSplitPalletTask), "Task/CreateRobotSplitPalletTask")
};
private readonly ICacheService _cache;
private readonly ILogger _logger;
public ApiRouteCacheWarmupHostedService(
ICacheService cache,
ILogger logger)
{
_cache = cache;
_logger = logger;
}
public Task StartAsync(CancellationToken cancellationToken)
{
const string cacheKeyPrefix = $"{RedisPrefix.Code}:{RedisName.API}:";
int warmedCount = 0;
foreach ((string configKey, string routePath) in ApiRouteMappings)
{
_cache.TryAdd($"{cacheKeyPrefix}{configKey}", routePath);
warmedCount++;
}
_logger.LogInformation("£ºAPI·ÓÉ»º´æÔ¤ÈÈÍê³É¡£¼ÆÊý={Count}", warmedCount);
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
}