public WebCacheInstanceFactory ExpiresAfter(TimeSpan duration)
        {
            if (duration != Cache.NoSlidingExpiration)
            {
                _expirationTime     = Cache.NoAbsoluteExpiration;
                _expirationBehavior = CachedItemExpirationBehavior.AfterTimeSpan;
            }

            _expirationDuration = duration;
            return(this);
        }
        public WebCacheInstanceFactory ExpiresOn(DateTime absoluteExpiration)
        {
            if (absoluteExpiration != Cache.NoAbsoluteExpiration)
            {
                _expirationDuration = Cache.NoSlidingExpiration;
                _expirationBehavior = CachedItemExpirationBehavior.AtScheduledDate;
            }

            _expirationTime = absoluteExpiration;
            return(this);
        }
        public object ActivateInstance(IObjectAssemblySpecification registration)
        {
            Cache cache = HttpRuntime.Cache;

            string key      = registration.Key;
            object instance = cache[key];

            if (instance == null)
            {
                lock (_syncRoot)
                {
                    instance = cache[key];
                    if (instance == null)
                    {
                        instance = registration.CreateInstance();

                        if (_expirationTime == Cache.NoAbsoluteExpiration &&
                            _expirationDuration == Cache.NoSlidingExpiration)
                        {
                            _expirationBehavior = CachedItemExpirationBehavior.NeverExpires;
                        }

                        switch (_expirationBehavior)
                        {
                        case CachedItemExpirationBehavior.NeverExpires:
                            cache.Insert(key, instance, _dependencies, Cache.NoAbsoluteExpiration,
                                         Cache.NoSlidingExpiration, _cachePriority, _onRemoveCallback);
                            break;

                        case CachedItemExpirationBehavior.AtScheduledDate:
                            cache.Insert(key, instance, _dependencies, _expirationTime,
                                         Cache.NoSlidingExpiration, _cachePriority, _onRemoveCallback);
                            break;

                        case CachedItemExpirationBehavior.AfterTimeSpan:
                            cache.Insert(key, instance, _dependencies, DateTime.UtcNow.Add(_expirationDuration),
                                         Cache.NoSlidingExpiration, _cachePriority, _onRemoveCallback);
                            break;

                        case CachedItemExpirationBehavior.AfterNotUsedInTimeSpan:
                            cache.Insert(key, instance, _dependencies, Cache.NoAbsoluteExpiration,
                                         _expirationDuration, _cachePriority, _onRemoveCallback);
                            break;
                        }
                    }
                }
            }

            return(instance);
        }