Хранение настроек в файле, многопоточность

Всем привет

Хочу сделать хранение настройек в json файле.

public interface ISettingsRepository<T> where T: new () 
{
    T Load();
    void Save(T settings);
}
public abstract class JsonFileSettingsRepository<T> : ISettingsRepository<T> where T : new ()
{
    private static readonly object _lock = new object();
    
    private readonly string _filePath = GetLocalFilePath($"{typeof(T).Name}.json");
    private readonly JsonSerializerOptions _serializerOptions = new()
    {
        WriteIndented = true
    };

    public T Load()
    {
        lock (_lock)
        {
            return File.Exists(_filePath)
                ? JsonSerializer.Deserialize<T>(File.ReadAllText(_filePath)) ?? new T()
                : new T();
        }
    }

    public void Save(T settings)
    {
        lock (_lock)
        {
            var json = JsonSerializer.Serialize(settings, _serializerOptions);
            Directory.CreateDirectory(Path.GetDirectoryName(_filePath)!);
            File.WriteAllText(_filePath, json);
        }
    }
    
    private static string GetLocalFilePath(string fileName)
    {
        var appData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); 
        var companyName = Assembly.GetEntryAssembly()?.GetCustomAttributes<AssemblyCompanyAttribute>().FirstOrDefault();
        return Path.Combine(appData, companyName?.Company ?? Assembly.GetEntryAssembly()?.GetName().Name ?? string.Empty, fileName);
    }
}
public class UserSettingsManager : JsonFileSettingsRepository<UserSettings>
{
}

Допустим кто-то один считает настройки, изменит их и пока решил не сохранять. Кто-то другой тоже считал настройки, модифицировал, сохранил. Первый решил сохранить. Естественно настройки последенего перезатерлись в файле.

Как написать код такой, чтоб такого не происходило? На ум приходит что-то типа файла .lock, но тогда доступа до настроек не будет у другого, пока первый не сохранит.

Либо определять, что файл был изменен (FileSystemWatcher) и пред сохранением считывать актуальное состояние, как-то мерджить эти настройки и сохранять (бред какой-то).

Вреоятно есть какое-то адекватное решение? Или проблема не такая уж проблема?


Ответы (0 шт):