using Microsoft.Extensions.Caching.Memory; namespace DramaLing.Api.Services.Infrastructure.Caching; public class MemoryCacheProvider : ICacheProvider { private readonly IMemoryCache _memoryCache; private readonly ILogger _logger; public string ProviderName => "Memory"; public MemoryCacheProvider( IMemoryCache memoryCache, ILogger logger) { _memoryCache = memoryCache ?? throw new ArgumentNullException(nameof(memoryCache)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } public Task GetAsync(string key) where T : class { try { if (_memoryCache.TryGetValue(key, out T? result)) { _logger.LogDebug("Memory cache hit for key: {Key}", key); return Task.FromResult(result); } _logger.LogDebug("Memory cache miss for key: {Key}", key); return Task.FromResult(null); } catch (Exception ex) { _logger.LogError(ex, "Error getting from memory cache for key: {Key}", key); return Task.FromResult(null); } } public Task SetAsync(string key, T value, TimeSpan expiry) where T : class { try { _memoryCache.Set(key, value, expiry); _logger.LogDebug("Memory cache set for key: {Key}, expiry: {Expiry}", key, expiry); return Task.FromResult(true); } catch (Exception ex) { _logger.LogError(ex, "Error setting memory cache for key: {Key}", key); return Task.FromResult(false); } } public Task RemoveAsync(string key) { try { _memoryCache.Remove(key); _logger.LogDebug("Memory cache removed for key: {Key}", key); return Task.FromResult(true); } catch (Exception ex) { _logger.LogError(ex, "Error removing from memory cache for key: {Key}", key); return Task.FromResult(false); } } public Task ExistsAsync(string key) { try { return Task.FromResult(_memoryCache.TryGetValue(key, out _)); } catch (Exception ex) { _logger.LogError(ex, "Error checking memory cache existence for key: {Key}", key); return Task.FromResult(false); } } public Task ClearAsync() { try { // MemoryCache 沒有直接清除所有項目的方法 _logger.LogWarning("Memory cache clear is not directly supported"); return Task.FromResult(true); } catch (Exception ex) { _logger.LogError(ex, "Error clearing memory cache"); return Task.FromResult(false); } } }