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
|
{
|
/// <summary>
|
/// 基础设施启动引导 - 初始化并注册所有核心服务到 UtilContainer
|
/// </summary>
|
public static class InfrastructureBootstrapper
|
{
|
private static readonly ILog log = LogManager.GetLogger(typeof(InfrastructureBootstrapper));
|
private static bool _initialized = false;
|
|
/// <summary>
|
/// 初始化基础设施服务
|
/// 应在 WPF 主程序启动时或插件 InitFinish 中调用
|
/// </summary>
|
/// <param name="deviceConfigDbPath">DeviceConfig 插件的 SQLite 数据库路径</param>
|
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;
|
}
|
}
|
|
/// <summary>
|
/// 从 DeviceConfig 数据库加载设备定义并注册驱动
|
/// </summary>
|
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);
|
}
|
}
|
|
/// <summary>
|
/// 注册单个设备驱动(供外部调用,用于动态添加设备)
|
/// </summary>
|
public static void RegisterDevice(string deviceId, string transport, string endpoint)
|
{
|
var container = new UtilContainer();
|
var deviceManager = container.GetUtil<IDeviceManager>("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);
|
}
|
}
|
|
/// <summary>
|
/// 重置基础设施(用于测试或重新初始化)
|
/// </summary>
|
public static void Reset()
|
{
|
_initialized = false;
|
log.Info("基础设施已重置");
|
}
|
}
|
}
|