1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using System;
using System.Threading;
using System.Threading.Tasks;
 
namespace Aging.Infrastructure.Contracts
{
    /// <summary>
    /// 资源冲突异常。
    /// 当尝试预约已被其他所有者占用的资源时抛出。
    /// </summary>
    public sealed class ResourceConflictException : Exception
    {
        /// <summary>
        /// 初始化资源冲突异常实例
        /// </summary>
        /// <param name="message">冲突描述信息</param>
        public ResourceConflictException(string message) : base(message)
        {
        }
 
        /// <summary>
        /// 初始化资源冲突异常实例
        /// </summary>
        /// <param name="message">冲突描述信息</param>
        /// <param name="innerException">内部异常</param>
        public ResourceConflictException(string message, Exception innerException) : base(message, innerException)
        {
        }
    }
 
    /// <summary>
    /// 资源管理接口。
    /// 提供硬件资源的预约、租约获取和释放功能,确保资源不被多个会话同时占用。
    /// </summary>
    public interface IResourceManager
    {
        /// <summary>
        /// 异步预约资源。
        /// 创建长期预约,阻止其他所有者使用该资源。
        /// </summary>
        /// <param name="owner">所有者令牌</param>
        /// <param name="resource">资源键</param>
        /// <param name="ct">取消令牌</param>
        /// <returns>资源预约实体</returns>
        /// <exception cref="ResourceConflictException">资源已被其他所有者预约时抛出</exception>
        Task<ResourceReservation> ReserveAsync(ResourceOwnerToken owner, ResourceKey resource, CancellationToken ct);
 
        /// <summary>
        /// 异步获取操作租约。
        /// 在执行具体硬件操作前调用,确保操作期间资源不被抢占。
        /// </summary>
        /// <param name="owner">所有者令牌</param>
        /// <param name="resource">资源键</param>
        /// <param name="ct">取消令牌</param>
        /// <returns>操作租约</returns>
        /// <exception cref="InvalidOperationException">资源未预约或所有者不匹配时抛出</exception>
        Task<IOperationLease> AcquireOperationAsync(ResourceOwnerToken owner, ResourceKey resource, CancellationToken ct);
 
        /// <summary>
        /// 异步释放资源预约。
        /// 取消对资源的占用,允许其他所有者预约。
        /// </summary>
        /// <param name="owner">所有者令牌</param>
        /// <param name="resource">资源键</param>
        /// <param name="ct">取消令牌</param>
        Task ReleaseReservationAsync(ResourceOwnerToken owner, ResourceKey resource, CancellationToken ct);
 
        /// <summary>
        /// 检查资源是否已被预约
        /// </summary>
        /// <param name="resource">资源键</param>
        /// <param name="reservation">输出预约实体(如果已预约)</param>
        /// <returns>资源是否已被预约</returns>
        bool IsReserved(ResourceKey resource, out ResourceReservation? reservation);
 
        /// <summary>
        /// 验证所有者令牌是否匹配指定资源的预约
        /// </summary>
        /// <param name="owner">所有者令牌</param>
        /// <param name="resource">资源键</param>
        /// <returns>所有者是否匹配</returns>
        bool ValidateOwner(ResourceOwnerToken owner, ResourceKey resource);
    }
}