internal async Task RemoveSiteDefinitionAsync()
        {
            SiteDefinition site = Manager.CurrentSite;

            if (site.IsDefaultSite)
            {
                throw new Error(this.__ResStr("cantDeleteDefault", "The default site of a YetaWF instance cannot be removed"));
            }

            using (await lockObject.LockAsync()) { // protect SiteCache locally
                // remove all saved data
                SiteCache.Remove(site.SiteDomain.ToLower());
                if (!string.IsNullOrWhiteSpace(site.StaticDomain))
                {
                    StaticSiteCache.Remove(site.StaticDomain.ToLower());
                }
                if (!string.IsNullOrWhiteSpace(site.SiteTestDomain))
                {
                    TestSiteCache.Remove(site.SiteTestDomain.ToLower());
                }

                await Package.RemoveSiteDataAsync(Manager.SiteFolder);

                await DataProvider.RemoveAsync(site.SiteDomain);// remove domain
            }
            await Auditing.AddAuditAsync($"{nameof(SiteDefinitionDataProvider)}.{nameof(SaveSiteDefinitionAsync)}", site.SiteDomain, Guid.Empty,
                                         "Remove Site",
                                         DataBefore : site,
                                         DataAfter : null,
                                         ExpensiveMultiInstance : true
                                         );
        }
        /// <summary>
        /// Load a site definition for a static site domain.
        /// </summary>
        /// <param name="staticDomain">The domain name.</param>
        /// <returns></returns>
        public Task <SiteDefinition> LoadStaticSiteDefinitionAsync(string staticDomain)
        {
            SiteDefinition site;

            if (StaticSiteCache.TryGetValue(staticDomain.ToLower(), out site))
            {
                return(Task.FromResult(site));
            }
            return(Task.FromResult <SiteDefinition>(null));
        }
        /// <summary>
        /// Save the site definition for the current site
        /// </summary>
        internal async Task SaveSiteDefinitionAsync(SiteDefinition site)
        {
            SiteDefinition origSite = YetaWF.Core.Audit.Auditing.Active ? await LoadSiteDefinitionAsync(site.OriginalSiteDomain) : null;

            using (await lockObject.LockAsync()) { // protect SiteCache locally
                SiteCache.Remove(site.SiteDomain.ToLower());
                if (!string.IsNullOrWhiteSpace(site.StaticDomain))
                {
                    StaticSiteCache.Remove(site.StaticDomain.ToLower());
                }
                if (!string.IsNullOrWhiteSpace(site.SiteTestDomain))
                {
                    TestSiteCache.Remove(site.SiteTestDomain.ToLower());
                }
                SiteCache.Add(site.SiteDomain.ToLower(), site);
                if (!string.IsNullOrWhiteSpace(site.StaticDomain))
                {
                    StaticSiteCache.Add(site.StaticDomain.ToLower(), site);
                }
                if (!string.IsNullOrWhiteSpace(site.SiteTestDomain))
                {
                    TestSiteCache.Add(site.SiteTestDomain.ToLower(), site);
                }

                AddLockedStatus(site);
                CleanData(site);
                await SaveImagesAsync(ModuleDefinition.GetPermanentGuid(typeof(SitePropertiesModule)), site);

                if (site.OriginalSiteDomain != null)
                {
                    UpdateStatusEnum status = await DataProvider.UpdateAsync(site.OriginalSiteDomain, site.SiteDomain, site);

                    if (status != UpdateStatusEnum.OK)
                    {
                        throw new Error(this.__ResStr("updFail", "Can't update site definition - it may have already been removed", site.OriginalSiteDomain));
                    }
                }
                else
                {
                    if (!await DataProvider.AddAsync(site))
                    {
                        throw new Error(this.__ResStr("siteExists", "Can't add new site \"{0}\" - site already exists", site.SiteDomain));
                    }
                    site.OriginalSiteDomain = site.SiteDomain;
                }
                // update appsettings.json
                if (string.Compare(YetaWFManager.DefaultSiteName, site.OriginalSiteDomain, true) == 0 && site.SiteDomain != site.OriginalSiteDomain)
                {
                    WebConfigHelper.SetValue <string>(YetaWF.Core.Controllers.AreaRegistration.CurrentPackage.AreaName, "DEFAULTSITE", site.SiteDomain);
                    await WebConfigHelper.SaveAsync();

                    await Auditing.AddAuditAsync($"{nameof(SiteDefinitionDataProvider)}.{nameof(SaveSiteDefinitionAsync)}", site.OriginalSiteDomain, Guid.Empty,
                                                 $"DEFAULTSITE", RequiresRestart : true
                                                 );
                }
                // Save a json representation of the site (can be used for batch mode initialization to avoid having to need a SiteProperties reference and access to DB)
                await FileSystem.FileSystemProvider.CreateDirectoryAsync(Path.Combine(YetaWFManager.RootFolderWebProject, Globals.DataFolder, "Sites"));

                string file = Path.Combine(YetaWFManager.RootFolderWebProject, Globals.DataFolder, "Sites", site.SiteDomain + ".json".ToLower());
                string json = Utility.JsonSerialize(site, true);
                await FileSystem.FileSystemProvider.WriteAllTextAsync(file, json);
            }
            await Auditing.AddAuditAsync($"{nameof(SiteDefinitionDataProvider)}.{nameof(SaveSiteDefinitionAsync)}", site.OriginalSiteDomain, Guid.Empty,
                                         "Save Site Settings",
                                         DataBefore : origSite,
                                         DataAfter : site,
                                         ExpensiveMultiInstance : true
                                         );
        }