public static DistributedApplicationData AddFilePersistence(
            this DistributedApplicationData applicationData
            , IServiceProvider provider
            , ISettingsMetadata metadata
            , SettingsScopes settingsScope = SettingsScopes.Both
            , string localRootPath         = ".\\Local"
            , string roamingRootPath       = ".\\Roaming")
        {
            FilePersistenceManager.Build(provider);

            if (settingsScope == SettingsScopes.Both || settingsScope == SettingsScopes.Local)
            {
                FilePersistenceManager.Current.AddApplicationData(
                    applicationData.LocalSettings, settingsScope);
            }

            if (settingsScope == SettingsScopes.Both || settingsScope == SettingsScopes.Roaming)
            {
                FilePersistenceManager.Current.AddApplicationData(
                    applicationData.RoamingSettings, settingsScope);
            }

            applicationData.DataChanged += ApplicationDataOnDataChanged;

            return(applicationData);
        }
        public FilePersistenceManager(IServiceProvider provider
                                      , IConfiguration configuration
                                      , ISettingsMetadata metadata
                                      , IFilePersistenceProvider persistenceProvider)
        {
            _current = this;

            Configuration       = configuration;
            Metadata            = metadata;
            PersistenceProvider = persistenceProvider;

            LocalPath ??= configuration[SETTINGS_SYNC_DEFAULT_PATH_LOCAL] ??
            Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
                         metadata.AppName);

            if (!File.Exists(Path.Combine(LocalPath, Metadata.AppName + $".{PersistenceProvider.FileExtension}")))
            {
                var fileWriter = PersistenceProvider.FileType switch
                {
                    FileTypes.Binary => (IFilePersistenceProvider)provider.GetService <BinaryPersistenceProvider>(),
                    FileTypes.XML => (IFilePersistenceProvider)provider.GetService <XmlPersistenceProvider>(),
                    FileTypes.Other => (IFilePersistenceProvider)provider.GetService(
                        Assembly
                        .Load(configuration[SETTINGS_SYNC_SETTINGS_FILE_OTHER_PROVIDER_ASSEMBLY])
                        .GetType(configuration[SETTINGS_SYNC_SETTINGS_FILE_OTHER_PROVIDER])),
                    _ => (IFilePersistenceProvider)provider.GetService <JsonPersistenceProvider>()
                };

                var blankFile = new DistributedPropertySet();
                blankFile.SetValues(Metadata.BlankFile[SettingsScopes.Local]);

                fileWriter.WriteFile(Metadata.AppName, LocalPath, SettingsScopes.Local, blankFile);
            }
            var localData = PersistenceProvider.OpenFile(Metadata.AppName, LocalPath, SettingsScopes.Local);

            AddApplicationData(localData, SettingsScopes.Local);

            RoamingPath ??= configuration[SETTINGS_SYNC_DEFAULT_PATH_ROAMING] ??
            Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
                         "One Drive", metadata.AppName);

            if (!File.Exists(Path.Combine(RoamingPath, Metadata.AppName + $".{PersistenceProvider.FileExtension}")))
            {
                var fileWriter = PersistenceProvider.FileType switch
                {
                    FileTypes.Binary => (IFilePersistenceProvider)provider.GetService <BinaryPersistenceProvider>(),
                    FileTypes.XML => (IFilePersistenceProvider)provider.GetService <XmlPersistenceProvider>(),
                    FileTypes.Other => (IFilePersistenceProvider)provider.GetService(
                        Assembly
                        .Load(configuration[SETTINGS_SYNC_SETTINGS_FILE_OTHER_PROVIDER_ASSEMBLY])
                        .GetType(configuration[SETTINGS_SYNC_SETTINGS_FILE_OTHER_PROVIDER])),
                    _ => (IFilePersistenceProvider)provider.GetService <JsonPersistenceProvider>()
                };

                var blankFile = new DistributedPropertySet();
                blankFile.SetValues(Metadata.BlankFile[SettingsScopes.Roaming]);

                fileWriter.WriteFile(Metadata.AppName, RoamingPath, SettingsScopes.Roaming, blankFile);
            }

            var roamingData = PersistenceProvider.OpenFile(Metadata.AppName, RoamingPath, SettingsScopes.Roaming);

            AddApplicationData(localData, SettingsScopes.Roaming);
        }
 public static FilePersistenceManager Build(IServiceProvider serviceProvider)
 {
     return(_current = serviceProvider.GetService <FilePersistenceManager>());
 }