diff --git a/WheelWizard/Program.cs b/WheelWizard/Program.cs index f76299f7..c4db8afa 100644 --- a/WheelWizard/Program.cs +++ b/WheelWizard/Program.cs @@ -15,27 +15,31 @@ public class Program [STAThread] public static void Main(string[] args) { - Setup(); - + // Make sure this is the first action on startup! + SetupWorkingDirectory(); // Start the application BuildAvaloniaApp().StartWithClassicDesktopLifetime(args); } + private static ServiceProvider BuildServiceProvider() + { + var services = new ServiceCollection(); + services.AddWheelWizardServices(); + + var serviceProvider = services.BuildServiceProvider(); + return serviceProvider; + } + // Avalonia configuration, don't remove; also used by visual designer. // ReSharper disable once MemberCanBePrivate.Global public static AppBuilder BuildAvaloniaApp() => ConfigureAvaloniaApp(AppBuilder.Configure() .UsePlatformDetect() - .WithInterFont() - ); + .WithInterFont()); private static AppBuilder ConfigureAvaloniaApp(AppBuilder builder) { - var services = new ServiceCollection(); - services.AddWheelWizardServices(); - - var serviceProvider = services.BuildServiceProvider(); - + var serviceProvider = BuildServiceProvider(); // Write startup message var logger = serviceProvider.GetRequiredService>(); LogPlatformInformation(logger); @@ -51,6 +55,11 @@ private static AppBuilder ConfigureAvaloniaApp(AppBuilder builder) // Set the service provider in the application instance app.SetServiceProvider(serviceProvider); + + // Make sure this comes AFTER setting the service provider + // of the `App` instance! Otherwise, things like logging will not work + // in `Setup`. + Setup(); }); return builder; @@ -89,7 +98,6 @@ private static void SetupWorkingDirectory() private static void Setup() { - SetupWorkingDirectory(); SettingsManager.Instance.LoadSettings(); UrlProtocolManager.SetWhWzScheme(); } diff --git a/WheelWizard/Services/Settings/WhWzSettingManager.cs b/WheelWizard/Services/Settings/WhWzSettingManager.cs index 9c39a507..692b5c23 100644 --- a/WheelWizard/Services/Settings/WhWzSettingManager.cs +++ b/WheelWizard/Services/Settings/WhWzSettingManager.cs @@ -1,6 +1,8 @@ +using Microsoft.Extensions.Logging; using System.Text.Json; using WheelWizard.Helpers; using WheelWizard.Models.Settings; +using WheelWizard.Views; using JsonElement = System.Text.Json.JsonElement; using JsonSerializerOptions = System.Text.Json.JsonSerializerOptions; @@ -10,25 +12,25 @@ public class WhWzSettingManager { private bool _loaded; private readonly Dictionary _settings = new(); - + public static WhWzSettingManager Instance { get; } = new(); private WhWzSettingManager() { } - + public void RegisterSetting(WhWzSetting setting) { - if (_loaded) + if (_loaded) return; - + _settings.Add(setting.Name, setting); } - + public void SaveSettings(WhWzSetting invokingSetting) { - if (!_loaded) + if (!_loaded) return; - + var settingsToSave = new Dictionary(); - + foreach (var (name, setting) in _settings) { settingsToSave[name] = setting.Get(); @@ -36,10 +38,10 @@ public void SaveSettings(WhWzSetting invokingSetting) var jsonString = JsonSerializer.Serialize(settingsToSave, new JsonSerializerOptions { WriteIndented = true }); FileHelper.WriteAllTextSafe(PathManager.WheelWizardConfigFilePath, jsonString); } - + public void LoadSettings() { - if (_loaded) + if (_loaded) return; _loaded = true; @@ -47,18 +49,25 @@ public void LoadSettings() var jsonString = FileHelper.ReadAllTextSafe(PathManager.WheelWizardConfigFilePath); if (jsonString == null) return; - jsonString.Trim('\0'); - - var loadedSettings = JsonSerializer.Deserialize>(jsonString); - if (loadedSettings == null) - return; - - foreach (var kvp in loadedSettings) + + try + { + var loadedSettings = JsonSerializer.Deserialize>(jsonString); + if (loadedSettings == null) + return; + + foreach (var kvp in loadedSettings) + { + if (!_settings.TryGetValue(kvp.Key, out var setting)) + continue; + + setting.SetFromJson(kvp.Value); + } + } + catch (JsonException e) { - if (!_settings.TryGetValue(kvp.Key, out var setting)) - continue; - - setting.SetFromJson(kvp.Value); + App.Services.GetRequiredService>() + .LogError(e, "Failed to deserialize the JSON config"); } } }