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("基础设施已重置"); } } }