using System; using System.Collections.Concurrent; using System.Collections.Generic; using Google.Protobuf; namespace ASC.Common.Caching { [Singletone] public class MemoryCacheNotify : ICacheNotify where T : IMessage, new() { private readonly ConcurrentDictionary>> _actions; public MemoryCacheNotify() { _actions = new ConcurrentDictionary>>(); } public void Publish(T obj, CacheNotifyAction action) { if (_actions.TryGetValue(GetKey(action), out var onchange) && onchange != null) { foreach (var a in onchange) { a(obj); } } } public void Subscribe(Action onchange, CacheNotifyAction notifyAction) { if (onchange != null) { var key = GetKey(notifyAction); _actions.TryAdd(key, new List>()); _actions[key].Add(onchange); } } public void Unsubscribe(CacheNotifyAction action) { _actions.TryRemove(GetKey(action), out _); } private string GetKey(CacheNotifyAction cacheNotifyAction) { return $"{typeof(T).Name}{cacheNotifyAction}"; } } }