public static string GetCachingInterceptKey(this ServiceEntry serviceEntry, [NotNull] object[] parameters, [NotNull] ICachingInterceptProvider cachingInterceptProvider) { Check.NotNull(parameters, nameof(parameters)); Check.NotNull(cachingInterceptProvider, nameof(cachingInterceptProvider)); var templete = cachingInterceptProvider.KeyTemplete; if (templete.IsNullOrEmpty()) { throw new LmsException("缓存拦截指定的KeyTemplete不允许为空", StatusCode.CachingInterceptError); } var cachingInterceptKey = string.Empty; var cacheKeyProviders = new List <ICacheKeyProvider>(); var index = 0; var typeConvertibleService = EngineContext.Current.Resolve <ITypeConvertibleService>(); foreach (var parameterDescriptor in serviceEntry.ParameterDescriptors) { if (parameterDescriptor.CacheKeys.Any()) { if (parameterDescriptor.IsSample) { var cacheKeyProvider = parameterDescriptor.CacheKeys.First(); cacheKeyProvider.Value = parameters[index]?.ToString(); cacheKeyProviders.Add(cacheKeyProvider); } else { var parameterValue = typeConvertibleService.Convert(parameters[index], parameterDescriptor.Type); foreach (var cacheKey in parameterDescriptor.CacheKeys) { var cacheKeyProp = parameterDescriptor.Type.GetProperty(cacheKey.PropName); Debug.Assert(cacheKeyProp != null, nameof(cacheKeyProp)); cacheKey.Value = cacheKeyProp.GetValue(parameterValue)?.ToString(); cacheKeyProviders.Add(cacheKey); } } } index++; } var templeteAgrs = cacheKeyProviders.OrderBy(p => p.Index).ToList().Select(ckp => ckp.Value).ToArray(); cachingInterceptKey = string.Format(templete, templeteAgrs); var currentServiceKey = EngineContext.Current.Resolve <ICurrentServiceKey>(); if (!currentServiceKey.ServiceKey.IsNullOrEmpty()) { cachingInterceptKey = $"serviceKey:{currentServiceKey.ServiceKey}:" + cachingInterceptKey; } if (cachingInterceptProvider.OnlyCurrentUserData) { var session = NullSession.Instance; if (!session.IsLogin()) { throw new LmsException("缓存数据如果指定与当前登录用户相关,那么必须登录系统才允许使用缓存拦截", StatusCode.CachingInterceptError); } cachingInterceptKey = cachingInterceptKey + $":userId:{session.UserId}"; } return(cachingInterceptKey); }
public static bool IsTransactionServiceEntry([NotNull] this ServiceEntry serviceEntry) { Check.NotNull(serviceEntry, nameof(serviceEntry)); return(serviceEntry.CustomAttributes.Any(p => p.GetType().GetTypeInfo().FullName == "Lms.Transaction.TransactionAttribute")); }