using log4net;
using HMI.Core.Util;
using Aging.Infrastructure.Contracts;
using Aging.Infrastructure.Core;
using Aging.Infrastructure.Services;
using Aging.Infrastructure.Drivers;
namespace Aging.Infrastructure
{
///
/// 基础设施启动引导 - 初始化并注册所有核心服务到 UtilContainer
///
public static class InfrastructureBootstrapper
{
private static readonly ILog log = LogManager.GetLogger(typeof(InfrastructureBootstrapper));
private static bool _initialized = false;
///
/// 初始化基础设施服务
/// 应在 WPF 主程序启动时或插件 InitFinish 中调用
///
/// DeviceConfig 插件的 SQLite 数据库路径
public static void Initialize(string deviceConfigDbPath)
{
if (_initialized)
{
log.Warn("基础设施已初始化,跳过重复初始化");
return;
}
try
{
log.Info("开始初始化基础设施服务...");
// 1. 创建 ResourceManager 单例
var resourceManager = new ResourceManager();
UtilContainer.RegisterUtil("ResourceManager", resourceManager);
log.Info("ResourceManager 已注册");
// 2. 创建 DeviceManager 单例
var deviceManager = new DeviceManager();
UtilContainer.RegisterUtil("DeviceManager", deviceManager);
log.Info("DeviceManager 已注册");
// 3. 创建 SlotDeviceMappingResolver(需要 DeviceConfig DB 路径)
var mappingResolver = new SlotDeviceMappingResolver(deviceConfigDbPath);
UtilContainer.RegisterUtil("SlotDeviceMappingResolver", mappingResolver);
log.Info("SlotDeviceMappingResolver 已注册");
// 4. 创建 DeviceService
var deviceService = new DeviceService(resourceManager, deviceManager, mappingResolver);
UtilContainer.RegisterUtil("DeviceService", deviceService);
log.Info("DeviceService 已注册");
// 5. 创建 PowerSupplyService
var powerSupplyService = new PowerSupplyService(resourceManager, deviceManager, mappingResolver);
UtilContainer.RegisterUtil("PowerSupplyService", powerSupplyService);
log.Info("PowerSupplyService 已注册");
// 6. 从数据库加载设备定义并注册驱动
LoadDevicesFromConfig(deviceManager, mappingResolver);
_initialized = true;
log.Info("基础设施服务初始化完成");
}
catch (Exception ex)
{
log.Error("基础设施初始化失败", ex);
throw;
}
}
///
/// 从 DeviceConfig 数据库加载设备定义并注册驱动
///
private static void LoadDevicesFromConfig(IDeviceManager deviceManager, SlotDeviceMappingResolver mappingResolver)
{
try
{
// 读取所有设备映射
var mappings = mappingResolver.GetAllMappings();
// 从映射中提取唯一的设备ID
var deviceIds = mappings
.Select(m => m.DeviceId)
.Distinct()
.ToList();
int loaded = 0;
foreach (var deviceId in deviceIds)
{
try
{
// 这里暂时使用通用 TCP 驱动作为占位
// 实际应该从 device_definition 表读取 transport 和 endpoint
// 然后通过 DriverFactory.CreateDriver 创建对应驱动
//
// TODO: 从数据库读取设备详细信息(transport, endpoint)
// var device = GetDeviceDefinition(deviceId);
// var driver = DriverFactory.CreateDriver(deviceId, device.Transport, device.Endpoint);
log.Debug($"设备 {deviceId} 驱动注册待配置详细信息");
loaded++;
}
catch (Exception ex)
{
log.Error($"注册设备 {deviceId} 驱动失败: {ex.Message}", ex);
}
}
log.Info($"从设备配置加载了 {loaded} 个设备驱动");
}
catch (Exception ex)
{
log.Error("加载设备配置失败", ex);
}
}
///
/// 注册单个设备驱动(供外部调用,用于动态添加设备)
///
public static void RegisterDevice(string deviceId, string transport, string endpoint)
{
var container = new UtilContainer();
var deviceManager = container.GetUtil("DeviceManager");
if (deviceManager == null)
{
log.Error("DeviceManager 未初始化");
return;
}
try
{
var driver = DriverFactory.CreateDriver(deviceId, transport, endpoint);
deviceManager.RegisterDriver(deviceId, driver);
log.Info($"设备 {deviceId} ({transport}) 驱动已注册");
}
catch (Exception ex)
{
log.Error($"注册设备 {deviceId} 失败: {ex.Message}", ex);
}
}
///
/// 重置基础设施(用于测试或重新初始化)
///
public static void Reset()
{
_initialized = false;
log.Info("基础设施已重置");
}
}
}