120 lines
5.6 KiB
C#
120 lines
5.6 KiB
C#
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
|
|
{
|
|
/// <summary>
|
|
/// 探测器工厂实现 | Detector factory implementation
|
|
/// 配置驱动的探测器实例创建
|
|
/// </summary>
|
|
public class DetectorFactory : IDetectorFactory
|
|
{
|
|
private readonly IEventAggregator _eventAggregator;
|
|
private readonly IContainerProvider _containerProvider;
|
|
private readonly ILoggerService _logger;
|
|
|
|
/// <summary>
|
|
/// 构造函数 | Constructor
|
|
/// </summary>
|
|
/// <param name="eventAggregator">事件聚合器 | Event aggregator</param>
|
|
/// <param name="containerProvider">Prism 容器 | Prism container</param>
|
|
/// <param name="logger">日志服务 | Logger service</param>
|
|
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");
|
|
}
|
|
|
|
/// <summary>
|
|
/// 创建探测器实例 | Create detector instance
|
|
/// </summary>
|
|
public DetectorResult<IAreaDetector> CreateDetector(DetectorConfig config)
|
|
{
|
|
if (config == null)
|
|
{
|
|
var errorMsg = "配置不能为空 | Configuration cannot be null";
|
|
_logger?.Error(null, errorMsg);
|
|
return DetectorResult<IAreaDetector>.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<IContainerExtension>();
|
|
containerExtension.RegisterInstance<IAreaDetector>(detector);
|
|
_logger?.Debug("探测器实例已注册到容器 | Detector instance registered to container");
|
|
|
|
_logger?.Info($"探测器创建成功,类型:{config.Type} | Detector created successfully, type: {config.Type}");
|
|
return DetectorResult<IAreaDetector>.Success(detector, "探测器创建成功 | Detector created successfully");
|
|
}
|
|
catch (NotImplementedException ex)
|
|
{
|
|
var errorMsg = $"探测器类型尚未实现 | Detector type not implemented: {ex.Message}";
|
|
_logger?.Warn(errorMsg);
|
|
return DetectorResult<IAreaDetector>.Failure(errorMsg, ex, -2);
|
|
}
|
|
catch (NotSupportedException ex)
|
|
{
|
|
var errorMsg = $"不支持的探测器类型 | Unsupported detector type: {ex.Message}";
|
|
_logger?.Error(ex, errorMsg);
|
|
return DetectorResult<IAreaDetector>.Failure(errorMsg, ex, -3);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
var errorMsg = $"创建探测器失败 | Failed to create detector: {ex.Message}";
|
|
_logger?.Error(ex, errorMsg);
|
|
return DetectorResult<IAreaDetector>.Failure(errorMsg, ex, -1);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 创建 Varex 探测器 | Create Varex detector
|
|
/// </summary>
|
|
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);
|
|
}
|
|
|
|
///// <summary>
|
|
///// 创建 iRay 探测器 | Create iRay detector
|
|
///// </summary>
|
|
//private IAreaDetector CreateIRayDetector(DetectorConfig config)
|
|
//{
|
|
// var irayConfig = config as IRayDetectorConfig
|
|
// ?? throw new ArgumentException("iRay 探测器需要 IRayDetectorConfig | iRay detector requires IRayDetectorConfig");
|
|
|
|
// return new IRayDetector(irayConfig, _eventAggregator);
|
|
//}
|
|
|
|
/// <summary>
|
|
/// 获取支持的探测器类型 | Get supported detector types
|
|
/// </summary>
|
|
public IEnumerable<DetectorType> GetSupportedTypes()
|
|
{
|
|
return new[] { DetectorType.Varex, DetectorType.IRay };
|
|
}
|
|
}
|
|
}
|