using Aging.Infrastructure.Contracts; namespace Aging.Infrastructure.Core { /// /// 操作租约实现。 /// 提供短期资源占用保证,支持同步和异步释放。 /// 释放时通过回调通知 ResourceManager。 /// public sealed class OperationLease : IOperationLease { private readonly Action? _onRelease; private bool _disposed; /// public string LeaseId { get; } /// public ResourceKey Resource { get; } /// public ResourceOwnerToken Owner { get; } /// public DateTime AcquiredAt { get; } /// public DateTime? ExpiresAt { get; } /// public bool IsValid => !_disposed && !IsExpired(); /// /// 初始化操作租约实例 /// /// 资源键 /// 所有者令牌 /// 释放时的回调通知 /// 租约有效期(秒),默认30秒 public OperationLease( ResourceKey resource, ResourceOwnerToken owner, Action? onRelease = null, int leaseDurationSeconds = 30) { LeaseId = Guid.NewGuid().ToString(); Resource = resource ?? throw new ArgumentNullException(nameof(resource)); Owner = owner ?? throw new ArgumentNullException(nameof(owner)); AcquiredAt = DateTime.UtcNow; ExpiresAt = leaseDurationSeconds > 0 ? AcquiredAt.AddSeconds(leaseDurationSeconds) : null; _onRelease = onRelease; _disposed = false; } /// /// 检查租约是否已过期 /// private bool IsExpired() { if (!ExpiresAt.HasValue) return false; return DateTime.UtcNow > ExpiresAt.Value; } /// public void Dispose() { if (_disposed) return; _disposed = true; _onRelease?.Invoke(); } /// public ValueTask DisposeAsync() { Dispose(); return default; } } }