public static object Get <T>(string key, int?cacheDurationSeconds = null)
        {
            try
            {
                T objFromCache;

                //first check mem cache
                objFromCache = ObjectCache.GetItem <T>(key);

                if (!EqualityComparer <T> .Default.Equals(objFromCache, default(T)))
                {
                    return(objFromCache);
                }

                //at this point we know it's not in memory
                //read from file system
                objFromCache = FileCache.GetItem <T>(key, cacheDurationSeconds);

                if (!EqualityComparer <T> .Default.Equals(objFromCache, default(T)))
                {
                    return(objFromCache);
                }

                if (Azure.IsReady)
                {
                    //not in mem or file
                    //hit blob storage
                    objFromCache = Azure.GetItem <T>(key, cacheDurationSeconds);

                    if (!EqualityComparer <T> .Default.Equals(objFromCache, default(T)))
                    {
                        return(objFromCache);
                    }
                }
                //TODO: else if (AmazonS3.IsReady)

                return(null);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }