public static class DistributedCacheExtensions { public static TItem GetOrCreate<TItem>(this IDistributedCache cache, string key, Func<DistributedCacheEntryOptions, TItem> factory) { TItem t = default(TItem); byte[] vs = cache.Get(key); if (vs == null) { var options = new DistributedCacheEntryOptions(); t = factory.Invoke(options); cache.Set(key, MessagePack.MessagePackSerializer.Serialize<TItem>(t), options); } else { t = MessagePack.MessagePackSerializer.Deserialize<TItem>(vs); } return t; } public static async Task<TItem> GetOrCreateAsync<TItem>(this IDistributedCache cache, string key, Func<DistributedCacheEntryOptions, Task<TItem>> factory) { TItem t = default(TItem); byte[] vs = cache.Get(key); if (vs == null) { var options = new DistributedCacheEntryOptions(); t = await factory.Invoke(options); await cache.SetAsync(key, MessagePack.MessagePackSerializer.Serialize<TItem>(t), options); } else { t = MessagePack.MessagePackSerializer.Deserialize<TItem>(vs); } return t; } }
User user = _distributedCache.GetOrCreate("key", (options) => { options.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(20); return new User { Id = 1, Name = "bidianqing" }; });
[DataContract] public class User { [DataMember(Order =0)] public int Id { get; set; } [DataMember(Order = 1)] public string Name { get; set; } }
Install-Package MessagePack