using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using OrpaonVision.SiteApp.Runtime.Contracts;
namespace OrpaonVision.SiteApp.Runtime.Services;
///
/// 运行时服务工厂,根据配置选择真实或模拟实现。
///
public sealed class RuntimeServiceFactory
{
private readonly ILogger _logger;
private readonly IServiceProvider _serviceProvider;
private readonly HikCameraOptions _cameraOptions;
private readonly YoloInferenceOptions _yoloOptions;
///
/// 构造函数。
///
public RuntimeServiceFactory(
ILogger logger,
IServiceProvider serviceProvider,
IOptions cameraOptions,
IOptions yoloOptions)
{
_logger = logger;
_serviceProvider = serviceProvider;
_cameraOptions = cameraOptions.Value;
_yoloOptions = yoloOptions.Value;
}
///
/// 创建海康相机服务。
///
public IHikCameraService CreateHikCameraService()
{
var runMode = _cameraOptions.RunMode?.ToUpperInvariant() ?? "MOCK";
_logger.LogInformation("创建海康相机服务,运行模式: {RunMode}", runMode);
return runMode switch
{
"REAL" => ResolveRequired(),
"MOCK" => ResolveRequired(),
_ => CreateFallbackCameraService()
};
}
///
/// 创建YOLO推理服务。
///
public IYoloInferenceService CreateYoloInferenceService()
{
var runMode = _yoloOptions.RunMode?.ToUpperInvariant() ?? "MOCK";
_logger.LogInformation("创建YOLO推理服务,运行模式: {RunMode}", runMode);
return runMode switch
{
"REAL" => ResolveRequired(),
"MOCK" => ResolveRequired(),
_ => CreateFallbackYoloService()
};
}
///
/// 创建回退海康相机服务。
///
private IHikCameraService CreateFallbackCameraService()
{
_logger.LogWarning("未知的相机运行模式,使用模拟实现");
return ResolveRequired();
}
///
/// 创建回退YOLO推理服务。
///
private IYoloInferenceService CreateFallbackYoloService()
{
_logger.LogWarning("未知的YOLO运行模式,使用模拟实现");
return ResolveRequired();
}
private T ResolveRequired() where T : class
{
var service = _serviceProvider.GetService(typeof(T)) as T;
if (service != null)
{
return service;
}
throw new InvalidOperationException($"无法解析服务: {typeof(T).FullName}");
}
}