Dispenser/DispenserHal/Camera/Factory/CameraFactory.cs

86 lines
2.1 KiB
C#

using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using DispenserHal.Camera.Client;
using DispenserHal.Camera.DTO;
using DispenserHal.Camera.Enum;
using DispenserHal.Camera.Interface;
using Serilog;
namespace DispenserHal.Camera.Factory;
public sealed class CameraFactory
{
private static AbstractCamera cameraSDK;
private static Type instanceType;
private static CameraConfig _config;
static CameraFactory()
{
InitType();
}
private static void InitType()
{
var asmb = Assembly.LoadFrom(CameraConfig.Dll);
instanceType = asmb.GetType(CameraConfig.Sdk);
if (instanceType == null)
{
Log.Error("加载sdk{0}失败", CameraConfig.Sdk);
throw new FileNotFoundException(CameraConfig.Sdk);
}
}
public static Builder ToBuilder(string sn)
{
return new Builder(sn);
}
private static CameraClient GetClient([NotNull] string sn, Dictionary<ParamTypeEnum, string> paramMap)
{
if (!CameraContainer.ContainsClient(sn))
{
var client = InitClient(sn, paramMap);
CameraContainer.AddClient(sn, client);
}
return CameraContainer.GetClient(sn);
}
private static CameraClient InitClient(string sn, Dictionary<ParamTypeEnum, string> paramMap)
{
object[] constructorArgs = [sn, paramMap];
cameraSDK = Activator.CreateInstance(instanceType, constructorArgs) as AbstractCamera;
var client = new CameraClient(cameraSDK);
Log.Information($"{sn}相机客户端初始化成功");
return client;
}
public class Builder
{
private Dictionary<ParamTypeEnum, string> _param;
private string _sn;
public Builder(string sn)
{
_sn = sn;
}
public Builder SN(string sn)
{
_sn = sn;
return this;
}
public Builder Param(Dictionary<ParamTypeEnum, string> param)
{
_param = param;
return this;
}
public CameraClient build()
{
return GetClient(_sn, _param);
}
}
}