public async Task <PageDefinition> LoadPageDefinitionAsync(Guid key)
        {
            GetCachedPageInfo pageInfo = await GetCachedPageAsync(key);

            PageDefinition page;

            if (pageInfo.Success)
            {
                page = pageInfo.Page;
                if (page != null)
                {
                    page.Temporary = false;
                }
            }
            else
            {
                page = await DataProvider.GetAsync(key);

                if (page != null)
                {
                    page.Temporary = false;
                    await SetCachedPageAsync(page);
                }
                else
                {
                    await SetEmptyCachedPageAsync(key);
                }
            }
            return(page);
        }
        private async Task <GetCachedPageInfo> GetCachedPageAsync(Guid guid)
        {
            GetCachedPageInfo pageInfo = new GetCachedPageInfo();
            GetObjectInfo <PageDefinition> objInfo;

            using (ICacheDataProvider sharedCacheDP = YetaWF.Core.IO.Caching.GetSharedCacheProvider()) {
                objInfo = await sharedCacheDP.GetAsync <PageDefinition>(CacheKey(guid));
            }
            if (!objInfo.Success)
            {
                return(pageInfo);
            }

            if (objInfo.Data != null)
            {
                // make a type correct copy of the data, we don't want caller to modify the cached page
                Type           objType = objInfo.Data.GetType();
                PageDefinition newObj  = (PageDefinition)Activator.CreateInstance(objType);
                ObjectSupport.CopyData(objInfo.Data, newObj);
                pageInfo.Page = newObj;
            }
            pageInfo.Success = true;
            return(pageInfo);
        }