Appearance
全局缓存
缓存对象用于"常用的", "记录比较少的"设置实体,将对象的字段缓存在全局中,所有模块均可访问。减少联表查询的次数。
定义缓存对象
缓存对象定义在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);
}