using System;
using System.Threading;
using System.Threading.Tasks;
namespace Aging.Infrastructure.Contracts
{
///
/// 资源冲突异常。
/// 当尝试预约已被其他所有者占用的资源时抛出。
///
public sealed class ResourceConflictException : Exception
{
///
/// 初始化资源冲突异常实例
///
/// 冲突描述信息
public ResourceConflictException(string message) : base(message)
{
}
///
/// 初始化资源冲突异常实例
///
/// 冲突描述信息
/// 内部异常
public ResourceConflictException(string message, Exception innerException) : base(message, innerException)
{
}
}
///
/// 资源管理接口。
/// 提供硬件资源的预约、租约获取和释放功能,确保资源不被多个会话同时占用。
///
public interface IResourceManager
{
///
/// 异步预约资源。
/// 创建长期预约,阻止其他所有者使用该资源。
///
/// 所有者令牌
/// 资源键
/// 取消令牌
/// 资源预约实体
/// 资源已被其他所有者预约时抛出
Task ReserveAsync(ResourceOwnerToken owner, ResourceKey resource, CancellationToken ct);
///
/// 异步获取操作租约。
/// 在执行具体硬件操作前调用,确保操作期间资源不被抢占。
///
/// 所有者令牌
/// 资源键
/// 取消令牌
/// 操作租约
/// 资源未预约或所有者不匹配时抛出
Task AcquireOperationAsync(ResourceOwnerToken owner, ResourceKey resource, CancellationToken ct);
///
/// 异步释放资源预约。
/// 取消对资源的占用,允许其他所有者预约。
///
/// 所有者令牌
/// 资源键
/// 取消令牌
Task ReleaseReservationAsync(ResourceOwnerToken owner, ResourceKey resource, CancellationToken ct);
///
/// 检查资源是否已被预约
///
/// 资源键
/// 输出预约实体(如果已预约)
/// 资源是否已被预约
bool IsReserved(ResourceKey resource, out ResourceReservation? reservation);
///
/// 验证所有者令牌是否匹配指定资源的预约
///
/// 所有者令牌
/// 资源键
/// 所有者是否匹配
bool ValidateOwner(ResourceOwnerToken owner, ResourceKey resource);
}
}