From 559890c482f5973f06aafdfec9550fee5ba3c7f2 Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 09 十一月 2026 17:02:15 +0800
Subject: [PATCH] feat: CAN 模拟器 TCP 化 + 多设备并发调试 + 后台生命周期管理

---
 Aging.Infrastructure/Contracts/IAutoDeviceFacade.cs |   88 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 88 insertions(+), 0 deletions(-)

diff --git a/Aging.Infrastructure/Contracts/IAutoDeviceFacade.cs b/Aging.Infrastructure/Contracts/IAutoDeviceFacade.cs
new file mode 100644
index 0000000..0162d3d
--- /dev/null
+++ b/Aging.Infrastructure/Contracts/IAutoDeviceFacade.cs
@@ -0,0 +1,88 @@
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Aging.Infrastructure.Contracts
+{
+    /// <summary>
+    /// 鑷姩鍖栬澶囬棬闈細涓哄叏鑷姩娴嬭瘯绋嬪簭鎻愪緵"涓�娆¤皟鐢�/涓�娆′綔鐢ㄥ煙"鐨勮涔夛紝
+    /// 鍐呴儴灏佽璧勬簮棰勭害銆侀┍鍔ㄥ垎娲俱�佸璁°��
+    /// 
+    /// 浣跨敤鍦烘櫙瀵规瘮锛�
+    ///   鎵嬪姩璋冭瘯锛圖eviceDebug锛夛細闇�瑕� UI 閫愭鎺у埗浼氳瘽鐘舵�侊紙ReadOnly 鈫� Maintenance锛夈��
+    ///   鍏ㄨ嚜鍔ㄦ祴璇曪紙TestStep锛夛細鍙叧蹇�"鍙戝懡浠ゆ嬁缁撴灉"锛屼笉甯屾湜鏆撮湶鐘舵�佹満銆�
+    /// 鏈帴鍙i潰鍚戝悗鑰呫��
+    /// </summary>
+    public interface IAutoDeviceFacade
+    {
+        /// <summary>
+        /// 涓�娆℃�ф墽琛岋細鍐呴儴鑷姩瀹屾垚 鐢宠绉熺害 鈫� 鎵撳紑浼氳瘽 鈫� 鎵ц 鈫� 鍏抽棴浼氳瘽 鈫� 閲婃斁绉熺害銆�
+        /// 閫傚悎鍗曟潯鍛戒护璋冪敤銆傚鏉″懡浠ゅ缓璁娇鐢� AcquireAsync 澶嶇敤绉熺害銆�
+        /// </summary>
+        Task<DeviceCommandResult> ExecuteAsync(
+            string deviceId, string command, CancellationToken ct = default);
+
+        /// <summary>
+        /// 涓�娆℃�ф煡璇細鍐呴儴鑷姩瀹屾垚瀹屾暣鐢熷懡鍛ㄦ湡銆�
+        /// </summary>
+        Task<DeviceCommandResult> QueryAsync(
+            string deviceId, string query, CancellationToken ct = default);
+
+        /// <summary>
+        /// 鐢宠浣滅敤鍩熺绾︼細鍗犵敤璁惧锛岃繑鍥� lease 鍙ユ焺銆�
+        /// using 缁撴潫鏃讹紙Dispose锛夎嚜鍔ㄥ叧浼氳瘽 + 閲婃斁绉熺害銆�
+        /// 鍚屼竴 lease 鍐呯殑澶氭璋冪敤鍏变韩鍚屼竴浠借祫婧愬崰鐢紝淇濊瘉鍘熷瓙鎬с��
+        /// </summary>
+        /// <param name="deviceId">璁惧鏍囪瘑</param>
+        /// <param name="stepName">娴嬭瘯姝ラ鍚嶇О锛堢敤浜庢棩蹇�/瀹¤鏍囪瘑锛�</param>
+        /// <param name="ct">鍙栨秷浠ょ墝锛涚敵璇疯秴鏃惰涓哄け璐�</param>
+        Task<IAutoDeviceLease> AcquireAsync(
+            string deviceId, string stepName, CancellationToken ct = default);
+
+        /// <summary>
+        /// 榛樿绉熺害瓒呮椂锛堢锛夈�傚彲鐢宠鏇寸煭鐨� per-call 瓒呮椂銆�
+        /// </summary>
+        int DefaultLeaseTimeoutSeconds { get; set; }
+    }
+
+    /// <summary>
+    /// 鑷姩鍖栬澶囦綔鐢ㄥ煙绉熺害銆�
+    /// 涓�娆$敵璇凤紝澶氭璋冪敤锛汥ispose 鏃惰嚜鍔ㄩ噴鏀俱��
+    /// </summary>
+    public interface IAutoDeviceLease : IDisposable
+    {
+        /// <summary>鏈绉熺害鍏宠仈鐨勮澶� ID</summary>
+        string DeviceId { get; }
+
+        /// <summary>鏈绉熺害鐨勫唴閮ㄤ細璇濇爣璇嗭紙鐢ㄤ簬瀹¤鍏宠仈锛�</summary>
+        string SessionId { get; }
+
+        /// <summary>娴嬭瘯姝ラ鍚嶇О</summary>
+        string StepName { get; }
+
+        /// <summary>鐢宠鏃跺埢</summary>
+        DateTime AcquiredAt { get; }
+
+        /// <summary>绉熺害鏄惁宸茶閲婃斁</summary>
+        bool IsReleased { get; }
+
+        /// <summary>
+        /// 鍦ㄧ绾︿綔鐢ㄥ煙鍐呭彂閫佸懡浠ゃ��
+        /// </summary>
+        Task<DeviceCommandResult> ExecuteAsync(string command, CancellationToken ct = default);
+
+        /// <summary>
+        /// 鍦ㄧ绾︿綔鐢ㄥ煙鍐呮煡璇€��
+        /// </summary>
+        Task<DeviceCommandResult> QueryAsync(string query, CancellationToken ct = default);
+
+        /// <summary>V3.0锛氱绾﹀け鏁堬紙缁湡杩炵画澶辫触/琚洖鏀讹級鏃惰Е鍙戯紱璁㈤槄鑰呭簲鍋滄涓嬪彂銆�</summary>
+        event EventHandler LeaseLost;
+
+        /// <summary>V3.0锛氭樉寮忓紓姝ラ噴鏀俱��</summary>
+        Task ReleaseAsync(CancellationToken ct = default);
+
+        /// <summary>V3.0锛氱淮鎶よ娓¤姹傦紙Draining 棰勭暀锛孧VP 鎭� false锛夈��</summary>
+        bool HandoverRequested { get; }
+    }
+}

--
Gitblit v1.9.1