| using Microsoft.Extensions.Caching.Memory; | 
| using System; | 
| using System.Collections.Generic; | 
| using System.Linq; | 
| using System.Text; | 
| using System.Threading.Tasks; | 
|   | 
| namespace WIDESEA_Core.Caches | 
| { | 
|     public class MemoryCacheService : ICacheService | 
|     { | 
|         protected IMemoryCache _cache; | 
|         public MemoryCacheService(IMemoryCache cache) | 
|         { | 
|             _cache = cache; | 
|   | 
|         } | 
|   | 
|         public bool Add(string key, string value, int expireSeconds = -1, bool isSliding = false) | 
|         { | 
|             return AddObject(key, value, expireSeconds, isSliding); | 
|         } | 
|   | 
|         public bool AddObject(string key, object value, int expireSeconds = -1, bool isSliding = false) | 
|         { | 
|             if (expireSeconds != -1) | 
|             { | 
|                 _cache.Set(key, | 
|                     value, | 
|                     new MemoryCacheEntryOptions() | 
|                     .SetSlidingExpiration(new TimeSpan(0, 0, expireSeconds)) | 
|                     ); | 
|             } | 
|             else | 
|             { | 
|                 _cache.Set(key, value); | 
|             } | 
|   | 
|             return true; | 
|         } | 
|   | 
|         public void AddOrUpdate(string key, string value, int expireSeconds = -1, bool isSliding = false) | 
|         { | 
|             if (!string.IsNullOrEmpty(Get(key))) | 
|             { | 
|                 Remove(key); | 
|                 Add(key, value, expireSeconds, isSliding); | 
|             } | 
|             else | 
|             { | 
|                 Add(key, value, expireSeconds, isSliding); | 
|             } | 
|         } | 
|   | 
|         public void Dispose() | 
|         { | 
|             if (_cache != null) | 
|                 _cache.Dispose(); | 
|             GC.SuppressFinalize(this); | 
|         } | 
|   | 
|         public bool Exists(string key) | 
|         { | 
|             if (key == null) | 
|             { | 
|                 throw new ArgumentNullException(nameof(key)); | 
|             } | 
|             return _cache.Get(key) != null; | 
|         } | 
|   | 
|         public T Get<T>(string key) where T : class | 
|         { | 
|             if (key == null) | 
|             { | 
|                 throw new ArgumentNullException(nameof(key)); | 
|             } | 
|             return _cache.Get(key) as T; | 
|         } | 
|   | 
|         public string Get(string key) | 
|         { | 
|             try | 
|             { | 
|                 return _cache.Get(key)?.ToString(); | 
|             } | 
|             catch | 
|             { | 
|                 return string.Empty; | 
|             } | 
|         } | 
|   | 
|         public bool Remove(string key) | 
|         { | 
|             if (key == null) | 
|             { | 
|                 throw new ArgumentNullException(nameof(key)); | 
|             } | 
|             _cache.Remove(key); | 
|   | 
|             return !Exists(key); | 
|         } | 
|   | 
|         public void Remove(IEnumerable<string> keys) | 
|         { | 
|             if (keys == null) | 
|             { | 
|                 throw new ArgumentNullException(nameof(keys)); | 
|             } | 
|   | 
|             keys.ToList().ForEach(item => _cache.Remove(item)); | 
|         } | 
|     } | 
| } |