Хранение настроек в файле, многопоточность
Всем привет
Хочу сделать хранение настройек в 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) и пред сохранением считывать актуальное состояние, как-то мерджить эти настройки и сохранять (бред какой-то).
Вреоятно есть какое-то адекватное решение? Или проблема не такая уж проблема?