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;
}
}
}