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