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 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 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 _param; private string _sn; public Builder(string sn) { _sn = sn; } public Builder SN(string sn) { _sn = sn; return this; } public Builder Param(Dictionary param) { _param = param; return this; } public CameraClient build() { return GetClient(_sn, _param); } } }