private string BuildCacheKey(Arguments arguments, A.Core.Interface.IService instance) { var sb = new StringBuilder(); if (!string.IsNullOrWhiteSpace(_prefix)) { sb.Append(_prefix); } else { sb.Append(_className); sb.Append("."); sb.Append(_methodName); } if (_isUserContextAware) { var userId = instance.ActionContext.Value.Data["UserId"].ToString(); sb.Append(".u." + userId); } sb.Append(":"); string output = JsonConvert.SerializeObject(arguments, jsonSerializerSettings); sb.Append(output); return(sb.ToString()); }
public override async void OnTaskCompletion(Task precedingTask, MethodExecutionArgs args) { A.Core.Interface.IService instance = (A.Core.Interface.IService)args.Instance; var cacheClient = instance.ActionContext.Value.CurrentContainer.Resolve <ICacheClient>(); string key = (string)args.MethodExecutionTag; dynamic retValue = ((dynamic)args.ReturnValue).Result; if (_expirationType == ExpirationType.Default) { await cacheClient.AddAsync(key, retValue); } else if (_expirationType == ExpirationType.ExpiresIn) { TimeSpan span = TimeSpan.Parse(_expirationPattern); await cacheClient.AddAsync(key, retValue, span); } }
public override void OnEntry(MethodExecutionArgs args) { A.Core.Interface.IService instance = (A.Core.Interface.IService)args.Instance; var cacheClient = instance.ActionContext.Value.CurrentContainer.Resolve <ICacheClient>(); var key = BuildCacheKey(args.Arguments, instance); var cacheResultTask = (dynamic)_getFromCacheMethodInfo.Invoke(cacheClient, new string[] { key }); var cacheResult = cacheResultTask.GetAwaiter().GetResult(); if (cacheResult.HasValue) { args.ReturnValue = Task.FromResult(cacheResult.Value); args.FlowBehavior = FlowBehavior.Return; } else { args.MethodExecutionTag = key; } }