using System.Collections.Generic; using System.Linq; using VCommon.Collections; namespace VCommon.VApplication.Setting { public interface ISettingProvider { IReadOnlyDictionary Settings { get; } ReadOnlyHashSet ApplicationScopeNames { get; } ReadOnlyHashSet TenantScopeNames { get; } ReadOnlyHashSet UserScopeNames { get; } ReadOnlyHashSet ScriptWritableNames { get; } IReadOnlyCollection ScriptOutputNames { get; } IReadOnlyCollection ApplicationScriptOutputNames { get; } } public abstract class SettingProviderBase : ISettingProvider { public IReadOnlyDictionary Settings { get; } public ReadOnlyHashSet ApplicationScopeNames { get; } public ReadOnlyHashSet TenantScopeNames { get; } public ReadOnlyHashSet UserScopeNames { get; } public ReadOnlyHashSet ScriptWritableNames { get; } public IReadOnlyCollection ScriptOutputNames { get; } public IReadOnlyCollection ApplicationScriptOutputNames { get; } protected SettingProviderBase() { Settings = Init(); var settingDefinitions = Settings.Values.ToArray(); ApplicationScopeNames = settingDefinitions.Where(p => p.Scope == SettingScope.Application).Select(p => p.Name).ToHashSet(); TenantScopeNames = settingDefinitions.Where(p => p.Scope == SettingScope.Tenant).Select(p => p.Name).ToHashSet(); UserScopeNames = settingDefinitions.Where(p => p.Scope == SettingScope.User).Select(p => p.Name).ToHashSet(); ScriptOutputNames = settingDefinitions.Where(p => p.ScriptAccess != SettingScriptAccess.None).Select(p => p.Name).ToArray(); ScriptWritableNames = settingDefinitions.Where(p => p.ScriptAccess == SettingScriptAccess.ReadWrite).Select(p => p.Name).ToHashSet(); ApplicationScriptOutputNames = settingDefinitions.Where(p => p.Scope == SettingScope.Application && p.ScriptAccess != SettingScriptAccess.None).Select(p => p.Name).ToArray(); } protected abstract IReadOnlyDictionary Init(); } }