using System;
using System.Collections.Generic;
using Prism.Events;
using Prism.Ioc;
using XP.Hardware.Detector.Abstractions;
using XP.Hardware.Detector.Abstractions.Enums;
using XP.Hardware.Detector.Config;
using XP.Hardware.Detector.Implementations;
using XP.Common.Logging.Interfaces;
namespace XP.Hardware.Detector.Factories
{
///
/// 探测器工厂实现 | Detector factory implementation
/// 配置驱动的探测器实例创建
///
public class DetectorFactory : IDetectorFactory
{
private readonly IEventAggregator _eventAggregator;
private readonly IContainerProvider _containerProvider;
private readonly ILoggerService _logger;
///
/// 构造函数 | Constructor
///
/// 事件聚合器 | Event aggregator
/// Prism 容器 | Prism container
/// 日志服务 | Logger service
public DetectorFactory(IEventAggregator eventAggregator, IContainerProvider containerProvider, ILoggerService logger = null)
{
_eventAggregator = eventAggregator ?? throw new ArgumentNullException(nameof(eventAggregator));
_containerProvider = containerProvider ?? throw new ArgumentNullException(nameof(containerProvider));
_logger = logger?.ForModule("DetectorFactory");
}
///
/// 创建探测器实例 | Create detector instance
///
public DetectorResult CreateDetector(DetectorConfig config)
{
if (config == null)
{
var errorMsg = "配置不能为空 | Configuration cannot be null";
_logger?.Error(null, errorMsg);
return DetectorResult.Failure(errorMsg);
}
try
{
_logger?.Info($"开始创建探测器,类型:{config.Type} | Starting to create detector, type: {config.Type}");
IAreaDetector detector = config.Type switch
{
DetectorType.Varex => CreateVarexDetector(config),
//DetectorType.IRay => CreateIRayDetector(config),
DetectorType.Hamamatsu => throw new NotImplementedException("Hamamatsu 探测器尚未实现 | Hamamatsu detector not implemented yet"),
_ => throw new NotSupportedException($"不支持的探测器类型:{config.Type} | Unsupported detector type: {config.Type}")
};
// 注册到容器(通过 IContainerExtension 注册实例)| Register to container
var containerExtension = _containerProvider.Resolve();
containerExtension.RegisterInstance(detector);
_logger?.Debug("探测器实例已注册到容器 | Detector instance registered to container");
_logger?.Info($"探测器创建成功,类型:{config.Type} | Detector created successfully, type: {config.Type}");
return DetectorResult.Success(detector, "探测器创建成功 | Detector created successfully");
}
catch (NotImplementedException ex)
{
var errorMsg = $"探测器类型尚未实现 | Detector type not implemented: {ex.Message}";
_logger?.Warn(errorMsg);
return DetectorResult.Failure(errorMsg, ex, -2);
}
catch (NotSupportedException ex)
{
var errorMsg = $"不支持的探测器类型 | Unsupported detector type: {ex.Message}";
_logger?.Error(ex, errorMsg);
return DetectorResult.Failure(errorMsg, ex, -3);
}
catch (Exception ex)
{
var errorMsg = $"创建探测器失败 | Failed to create detector: {ex.Message}";
_logger?.Error(ex, errorMsg);
return DetectorResult.Failure(errorMsg, ex, -1);
}
}
///
/// 创建 Varex 探测器 | Create Varex detector
///
private IAreaDetector CreateVarexDetector(DetectorConfig config)
{
var varexConfig = config as VarexDetectorConfig
?? throw new ArgumentException("Varex 探测器需要 VarexDetectorConfig | Varex detector requires VarexDetectorConfig");
_logger?.Debug($"创建 Varex 探测器实例,Binning 模式:{varexConfig.BinningMode},增益模式:{varexConfig.GainMode} | Creating Varex detector instance, Binning mode: {varexConfig.BinningMode}, Gain mode: {varexConfig.GainMode}");
return new VarexDetector(varexConfig, _eventAggregator, _logger);
}
/////
///// 创建 iRay 探测器 | Create iRay detector
/////
//private IAreaDetector CreateIRayDetector(DetectorConfig config)
//{
// var irayConfig = config as IRayDetectorConfig
// ?? throw new ArgumentException("iRay 探测器需要 IRayDetectorConfig | iRay detector requires IRayDetectorConfig");
// return new IRayDetector(irayConfig, _eventAggregator);
//}
///
/// 获取支持的探测器类型 | Get supported detector types
///
public IEnumerable GetSupportedTypes()
{
return new[] { DetectorType.Varex, DetectorType.IRay };
}
}
}