public override bool Equals(object obj) { if (Object.ReferenceEquals(this, obj)) { return(true); } if (!(obj is ServiceResultCacheKey)) { return(false); } ServiceResultCacheKey other = (ServiceResultCacheKey)obj; if (!Object.Equals(Method, other.Method) || !Object.Equals(ServiceName, other.ServiceName)) { return(false); } IList <Object> otherArgs = other.Arguments; for (int a = otherArgs.Count; a-- > 0;) { if (!Object.Equals(Arguments[a], otherArgs[a])) { return(false); } } return(true); }
public IServiceResult GetORIsOfService(IServiceDescription serviceDescription, ExecuteServiceDelegate executeServiceDelegate) { if (!UseResultCache) { return(executeServiceDelegate.Invoke(serviceDescription)); } ServiceResultCacheKey key = BuildKey(serviceDescription); IServiceResult serviceResult; lock (serviceCallToPendingResult) { serviceResult = serviceCallToResult.Get(key); if (serviceResult != null) { return(CreateServiceResult(serviceResult)); } while (serviceCallToPendingResult.Contains(key)) { Monitor.Wait(serviceCallToPendingResult); } serviceResult = serviceCallToResult.Get(key); if (serviceResult != null) { return(CreateServiceResult(serviceResult)); } serviceCallToPendingResult.Add(key); } bool success = false; try { if (SecurityActivation != null) { serviceResult = SecurityActivation.ExecuteWithoutFiltering(new IResultingBackgroundWorkerDelegate <IServiceResult>(delegate() { return(executeServiceDelegate.Invoke(serviceDescription)); })); } else { serviceResult = executeServiceDelegate.Invoke(serviceDescription); } success = true; } finally { lock (serviceCallToPendingResult) { serviceCallToPendingResult.Remove(key); if (success) { serviceCallToResult.Put(key, serviceResult); } Monitor.PulseAll(serviceCallToPendingResult); } } return(CreateServiceResult(serviceResult)); }
protected ServiceResultCacheKey BuildKey(IServiceDescription serviceDescription) { Object service = ServiceByNameProvider.GetService(serviceDescription.ServiceName); ServiceResultCacheKey key = new ServiceResultCacheKey(); key.Arguments = serviceDescription.Arguments; key.Method = serviceDescription.GetMethod(service.GetType()); key.ServiceName = serviceDescription.ServiceName; if (key.Method == null || key.ServiceName == null) { throw new ArgumentException("ServiceDescription not legal " + serviceDescription); } return(key); }