CacheManagerBase.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using System.Collections.Concurrent;
  2. using System.Collections.Generic;
  3. using System.Collections.Immutable;
  4. using System.Linq;
  5. using Abp.Dependency;
  6. using Abp.Runtime.Caching.Configuration;
  7. namespace Abp.Runtime.Caching
  8. {
  9. /// <summary>
  10. /// Base class for cache managers.
  11. /// </summary>
  12. public abstract class CacheManagerBase : ICacheManager, ISingletonDependency
  13. {
  14. protected readonly IIocManager IocManager;
  15. protected readonly ICachingConfiguration Configuration;
  16. protected readonly ConcurrentDictionary<string, ICache> Caches;
  17. /// <summary>
  18. /// Constructor.
  19. /// </summary>
  20. /// <param name="iocManager"></param>
  21. /// <param name="configuration"></param>
  22. protected CacheManagerBase(IIocManager iocManager, ICachingConfiguration configuration)
  23. {
  24. IocManager = iocManager;
  25. Configuration = configuration;
  26. Caches = new ConcurrentDictionary<string, ICache>();
  27. }
  28. public IReadOnlyList<ICache> GetAllCaches()
  29. {
  30. return Caches.Values.ToImmutableList();
  31. }
  32. public virtual ICache GetCache(string name)
  33. {
  34. Check.NotNull(name, nameof(name));
  35. return Caches.GetOrAdd(name, (cacheName) =>
  36. {
  37. var cache = CreateCacheImplementation(cacheName);
  38. var configurators = Configuration.Configurators.Where(c => c.CacheName == null || c.CacheName == cacheName);
  39. foreach (var configurator in configurators)
  40. {
  41. configurator.InitAction?.Invoke(cache);
  42. }
  43. return cache;
  44. });
  45. }
  46. public virtual void Dispose()
  47. {
  48. DisposeCaches();
  49. Caches.Clear();
  50. }
  51. protected virtual void DisposeCaches()
  52. {
  53. foreach (var cache in Caches)
  54. {
  55. IocManager.Release(cache.Value);
  56. }
  57. }
  58. /// <summary>
  59. /// Used to create actual cache implementation.
  60. /// </summary>
  61. /// <param name="name">Name of the cache</param>
  62. /// <returns>Cache object</returns>
  63. protected abstract ICache CreateCacheImplementation(string name);
  64. }
  65. }