Skip to content

全局缓存

缓存对象用于"常用的", "记录比较少的"设置实体,将对象的字段缓存在全局中,所有模块均可访问。减少联表查询的次数。

定义缓存对象

缓存对象定义在JingJian.Package.Common的GlobalCaches中。

c#
namespace JingJian.Package.Common.GlobalCaches
{
    public class BasicShopGlobalCache
    {
        // 缓存Key
        public const string Key = nameof(BasicShopGlobalCache);

        // 需要缓存的字段
        public int Id { get; set; }

        // 需要缓存的字段
        public string ShopName { get; set; } = string.Empty;
    }
}

注入缓存

在缓存提供的项目中,定义一个提供者,该提供者会被框架加载。

c#
namespace JingJian.Package.Basic.GlobalCacheProviders
{
    /// <summary>
    /// 
    /// </summary>
    public class BasicShopGlobalCacheProvider : IGlobalCacheProvider
    {
        /// <summary>
        /// 
        /// </summary>
        public string Key => BasicShopGlobalCache.Key;

        private readonly IShopService _shopService;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="shopService"></param>
        public BasicShopGlobalCacheProvider(IShopService shopService)
        {
            _shopService = shopService;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public IGlobalCacheItem Create() => new GlobalCacheItem<List<BasicShopGlobalCache>>(() =>
        {
            // 当数据变更时,清理缓存
            var lifetime = IocManager.Instance.RootServices.GetRequiredService<IAppServiceLifetime<BasicShop, int>>();
            lifetime.Subscribe(typeof(BasicShop), AppServiceSubscribeType.Changed, level
                => IocManager.Instance.RootServices.GetRequiredService<IGlobalCacheFactory>().Clear(Key));

            return _shopService.Entities.AsNoTracking().ToList().ToMapper<List<BasicShopGlobalCache>>();
        });
    }
}

获取缓存

在所有需要获取缓存的位置,通过IocManager获取全局缓存

c#
public async Task TestGlobalCache()
{
	var factory = IocManager.Instance.RootServices.GetRequiredService<IGlobalCacheFactory>();

    var shops = factory.GetValue<List<BasicShopGlobalCache>>(BasicShopGlobalCache.Key);
}

广州宝点数字化科技