예제 #1
0
        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);
        }
예제 #2
0
        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));
        }
예제 #3
0
        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);
        }