diff --git a/Wino.Core.Domain/Interfaces/IWinoServerConnectionManager.cs b/Wino.Core.Domain/Interfaces/IWinoServerConnectionManager.cs index 6ec12208..38c6a1a8 100644 --- a/Wino.Core.Domain/Interfaces/IWinoServerConnectionManager.cs +++ b/Wino.Core.Domain/Interfaces/IWinoServerConnectionManager.cs @@ -12,6 +12,8 @@ namespace Wino.Core.Domain.Interfaces WinoServerConnectionStatus Status { get; } event EventHandler StatusChanged; void DisposeConnection(); + + void QueueRequest(IRequestBase request, Guid accountId); } public interface IWinoServerConnectionManager : IWinoServerConnectionManager, IInitializeAsync diff --git a/Wino.Core.Domain/Interfaces/IWinoSynchronizerFactory.cs b/Wino.Core.Domain/Interfaces/IWinoSynchronizerFactory.cs index 9bf1489e..b14480c9 100644 --- a/Wino.Core.Domain/Interfaces/IWinoSynchronizerFactory.cs +++ b/Wino.Core.Domain/Interfaces/IWinoSynchronizerFactory.cs @@ -7,6 +7,5 @@ namespace Wino.Core.Domain.Interfaces { IBaseSynchronizer GetAccountSynchronizer(Guid accountId); IBaseSynchronizer CreateNewSynchronizer(MailAccount account); - void DeleteSynchronizer(MailAccount account); } } diff --git a/Wino.Core.Domain/Wino.Core.Domain.csproj b/Wino.Core.Domain/Wino.Core.Domain.csproj index 825929fc..426ce03a 100644 --- a/Wino.Core.Domain/Wino.Core.Domain.csproj +++ b/Wino.Core.Domain/Wino.Core.Domain.csproj @@ -6,6 +6,10 @@ 12.0 + + + + diff --git a/Wino.Core.UWP/Services/WinoServerConnectionManager.cs b/Wino.Core.UWP/Services/WinoServerConnectionManager.cs index 2518f092..80a21ee3 100644 --- a/Wino.Core.UWP/Services/WinoServerConnectionManager.cs +++ b/Wino.Core.UWP/Services/WinoServerConnectionManager.cs @@ -195,5 +195,10 @@ namespace Wino.Core.UWP.Services { if (Connection == null) return; } + + public void QueueRequest(IRequestBase request, Guid accountId) + { + // TODO: Queue this request to corresponding account's synchronizer request queue. + } } } diff --git a/Wino.Core/CoreContainerSetup.cs b/Wino.Core/CoreContainerSetup.cs index f57b66ee..0a89f203 100644 --- a/Wino.Core/CoreContainerSetup.cs +++ b/Wino.Core/CoreContainerSetup.cs @@ -18,7 +18,6 @@ namespace Wino.Core services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); diff --git a/Wino.Core/Services/WinoRequestDelegator.cs b/Wino.Core/Services/WinoRequestDelegator.cs index 6077b34f..afe02921 100644 --- a/Wino.Core/Services/WinoRequestDelegator.cs +++ b/Wino.Core/Services/WinoRequestDelegator.cs @@ -19,19 +19,18 @@ namespace Wino.Core.Services public class WinoRequestDelegator : IWinoRequestDelegator { private readonly IWinoRequestProcessor _winoRequestProcessor; - private readonly IWinoSynchronizerFactory _winoSynchronizerFactory; - + private readonly IWinoServerConnectionManager _winoServerConnectionManager; private readonly IFolderService _folderService; private readonly IDialogService _dialogService; private readonly ILogger _logger = Log.ForContext(); public WinoRequestDelegator(IWinoRequestProcessor winoRequestProcessor, - IWinoSynchronizerFactory winoSynchronizerFactory, + IWinoServerConnectionManager winoServerConnectionManager, IFolderService folderService, IDialogService dialogService) { _winoRequestProcessor = winoRequestProcessor; - _winoSynchronizerFactory = winoSynchronizerFactory; + _winoServerConnectionManager = winoServerConnectionManager; _folderService = folderService; _dialogService = dialogService; } @@ -133,19 +132,7 @@ namespace Wino.Core.Services } private void QueueRequest(IRequestBase request, Guid accountId) - { - var synchronizer = _winoSynchronizerFactory.GetAccountSynchronizer(accountId); - - if (synchronizer == null) - { - _logger.Warning("Synchronizer not found for account {AccountId}.", accountId); - _logger.Warning("Skipping queueing request {Operation}.", request.Operation); - - return; - } - - synchronizer.QueueRequest(request); - } + => _winoServerConnectionManager.QueueRequest(request, accountId); private void QueueSynchronization(Guid accountId) { diff --git a/Wino.Core/Wino.Core.csproj b/Wino.Core/Wino.Core.csproj index f6ed7e7d..9784ea24 100644 --- a/Wino.Core/Wino.Core.csproj +++ b/Wino.Core/Wino.Core.csproj @@ -7,6 +7,10 @@ 12 + + + + diff --git a/Wino.Mail.ViewModels/AccountDetailsPageViewModel.cs b/Wino.Mail.ViewModels/AccountDetailsPageViewModel.cs index 3dd7e535..5ce4b8fb 100644 --- a/Wino.Mail.ViewModels/AccountDetailsPageViewModel.cs +++ b/Wino.Mail.ViewModels/AccountDetailsPageViewModel.cs @@ -18,7 +18,6 @@ namespace Wino.Mail.ViewModels { public partial class AccountDetailsPageViewModel : BaseViewModel { - private readonly IWinoSynchronizerFactory _synchronizerFactory; private readonly IAccountService _accountService; private readonly IFolderService _folderService; @@ -44,11 +43,9 @@ namespace Wino.Mail.ViewModels public AccountDetailsPageViewModel(IDialogService dialogService, - IWinoSynchronizerFactory synchronizerFactory, IAccountService accountService, IFolderService folderService) : base(dialogService) { - _synchronizerFactory = synchronizerFactory; _accountService = accountService; _folderService = folderService; } @@ -98,10 +95,7 @@ namespace Wino.Mail.ViewModels await _accountService.DeleteAccountAsync(Account); - _synchronizerFactory.DeleteSynchronizer(Account); - - // TODO: Clear existing requests. - // _synchronizationWorker.ClearRequests(Account.Id); + // TODO: Server: Cancel ongoing calls from server for this account. DialogService.InfoBarMessage(Translator.Info_AccountDeletedTitle, string.Format(Translator.Info_AccountDeletedMessage, Account.Name), InfoBarMessageType.Success); diff --git a/Wino.Mail.ViewModels/AccountManagementViewModel.cs b/Wino.Mail.ViewModels/AccountManagementViewModel.cs index d1982489..2532c81c 100644 --- a/Wino.Mail.ViewModels/AccountManagementViewModel.cs +++ b/Wino.Mail.ViewModels/AccountManagementViewModel.cs @@ -16,7 +16,6 @@ using Wino.Core.Domain.Exceptions; using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.Navigation; using Wino.Core.Domain.Models.Store; -using Wino.Core.Domain.Models.Synchronization; using Wino.Core.Messages.Authorization; using Wino.Core.Messages.Navigation; using Wino.Mail.ViewModels.Data; @@ -35,7 +34,6 @@ namespace Wino.Mail.ViewModels private readonly IStoreManagementService _storeManagementService; private readonly IPreferencesService _preferencesService; private readonly IAuthenticationProvider _authenticationProvider; - private readonly IWinoSynchronizerFactory _synchronizerFactory; public ObservableCollection Accounts { get; set; } = []; @@ -60,7 +58,6 @@ namespace Wino.Mail.ViewModels public AccountManagementViewModel(IDialogService dialogService, IWinoNavigationService navigationService, - IWinoSynchronizerFactory synchronizerFactory, IAccountService accountService, IProviderService providerService, IFolderService folderService, @@ -69,7 +66,6 @@ namespace Wino.Mail.ViewModels IAuthenticationProvider authenticationProvider) : base(dialogService) { _accountService = accountService; - _synchronizerFactory = synchronizerFactory; _dialogService = dialogService; _providerService = providerService; _folderService = folderService; @@ -205,29 +201,31 @@ namespace Wino.Mail.ViewModels // Local account has been created. // Create new synchronizer and start synchronization. - var synchronizer = _synchronizerFactory.CreateNewSynchronizer(createdAccount); + // TODO: Server: Make sure that server synchronizes folders and sends back the result. - if (creationDialog is ICustomServerAccountCreationDialog customServerAccountCreationDialog) - customServerAccountCreationDialog.ShowPreparingFolders(); - else - creationDialog.State = AccountCreationDialogState.PreparingFolders; + //var synchronizer = _synchronizerFactory.CreateNewSynchronizer(createdAccount); - var options = new SynchronizationOptions() - { - AccountId = createdAccount.Id, - Type = SynchronizationType.FoldersOnly - }; + //if (creationDialog is ICustomServerAccountCreationDialog customServerAccountCreationDialog) + // customServerAccountCreationDialog.ShowPreparingFolders(); + //else + // creationDialog.State = AccountCreationDialogState.PreparingFolders; - var synchronizationResult = await synchronizer.SynchronizeAsync(options); + //var options = new SynchronizationOptions() + //{ + // AccountId = createdAccount.Id, + // Type = SynchronizationType.FoldersOnly + //}; - if (synchronizationResult.CompletedState != SynchronizationCompletedState.Success) - throw new Exception(Translator.Exception_FailedToSynchronizeFolders); + //var synchronizationResult = await synchronizer.SynchronizeAsync(options); - // Check if Inbox folder is available for the account after synchronization. - var isInboxAvailable = await _folderService.IsInboxAvailableForAccountAsync(createdAccount.Id); + //if (synchronizationResult.CompletedState != SynchronizationCompletedState.Success) + // throw new Exception(Translator.Exception_FailedToSynchronizeFolders); - if (!isInboxAvailable) - throw new Exception(Translator.Exception_InboxNotAvailable); + //// Check if Inbox folder is available for the account after synchronization. + //var isInboxAvailable = await _folderService.IsInboxAvailableForAccountAsync(createdAccount.Id); + + //if (!isInboxAvailable) + // throw new Exception(Translator.Exception_InboxNotAvailable); // Send changes to listeners. ReportUIChange(new AccountCreatedMessage(createdAccount)); diff --git a/Wino.Mail.ViewModels/AppShellViewModel.cs b/Wino.Mail.ViewModels/AppShellViewModel.cs index ce83b79c..96226233 100644 --- a/Wino.Mail.ViewModels/AppShellViewModel.cs +++ b/Wino.Mail.ViewModels/AppShellViewModel.cs @@ -74,7 +74,6 @@ namespace Wino.Mail.ViewModels private readonly INotificationBuilder _notificationBuilder; private readonly IWinoRequestDelegator _winoRequestDelegator; - private readonly IWinoSynchronizerFactory _synchronizerFactory; private readonly IBackgroundTaskService _backgroundTaskService; private readonly IMimeFileService _mimeFileService; @@ -88,7 +87,6 @@ namespace Wino.Mail.ViewModels public AppShellViewModel(IDialogService dialogService, IWinoNavigationService navigationService, - IWinoSynchronizerFactory synchronizerFactory, IBackgroundTaskService backgroundTaskService, IMimeFileService mimeFileService, INativeAppService nativeAppService, @@ -118,7 +116,6 @@ namespace Wino.Mail.ViewModels PreferencesService = preferencesService; NavigationService = navigationService; - _synchronizerFactory = synchronizerFactory; _backgroundTaskService = backgroundTaskService; _mimeFileService = mimeFileService; _nativeAppService = nativeAppService; @@ -791,65 +788,65 @@ namespace Wino.Mail.ViewModels await _winoRequestDelegator.ExecuteAsync(draftPreperationRequest); } - - public async void Receive(NewSynchronizationRequested message) { + // TODO: Queue new synchronization for an account. + // Don't send message for sync completion when we execute requests. // People are usually interested in seeing the notification after they trigger the synchronization. - bool shouldReportSynchronizationResult = message.Options.Type != SynchronizationType.ExecuteRequests; + //bool shouldReportSynchronizationResult = message.Options.Type != SynchronizationType.ExecuteRequests; - var synchronizer = _synchronizerFactory.GetAccountSynchronizer(message.Options.AccountId); + //var synchronizer = _synchronizerFactory.GetAccountSynchronizer(message.Options.AccountId); - if (synchronizer == null) return; + //if (synchronizer == null) return; - var accountId = message.Options.AccountId; + //var accountId = message.Options.AccountId; - message.Options.ProgressListener = this; + //message.Options.ProgressListener = this; - bool isSynchronizationSucceeded = false; + //bool isSynchronizationSucceeded = false; - try - { - // TODO: Cancellation Token - var synchronizationResult = await synchronizer.SynchronizeAsync(message.Options); + //try + //{ + // // TODO: Cancellation Token + // var synchronizationResult = await synchronizer.SynchronizeAsync(message.Options); - isSynchronizationSucceeded = synchronizationResult.CompletedState == SynchronizationCompletedState.Success; + // isSynchronizationSucceeded = synchronizationResult.CompletedState == SynchronizationCompletedState.Success; - // Create notification for synchronization result. - if (synchronizationResult.DownloadedMessages.Any()) - { - var accountInboxFolder = await _folderService.GetSpecialFolderByAccountIdAsync(message.Options.AccountId, SpecialFolderType.Inbox); + // // Create notification for synchronization result. + // if (synchronizationResult.DownloadedMessages.Any()) + // { + // var accountInboxFolder = await _folderService.GetSpecialFolderByAccountIdAsync(message.Options.AccountId, SpecialFolderType.Inbox); - if (accountInboxFolder == null) return; + // if (accountInboxFolder == null) return; - await _notificationBuilder.CreateNotificationsAsync(accountInboxFolder.Id, synchronizationResult.DownloadedMessages); - } - } - catch (AuthenticationAttentionException) - { - await SetAccountAttentionAsync(accountId, AccountAttentionReason.InvalidCredentials); - } - catch (SystemFolderConfigurationMissingException) - { - await SetAccountAttentionAsync(accountId, AccountAttentionReason.MissingSystemFolderConfiguration); - } - catch (OperationCanceledException) - { - DialogService.InfoBarMessage(Translator.Info_SyncCanceledMessage, Translator.Info_SyncCanceledMessage, InfoBarMessageType.Warning); - } - catch (Exception ex) - { - DialogService.InfoBarMessage(Translator.Info_SyncFailedTitle, ex.Message, InfoBarMessageType.Error); - } - finally - { - if (shouldReportSynchronizationResult) - Messenger.Send(new AccountSynchronizationCompleted(accountId, - isSynchronizationSucceeded ? SynchronizationCompletedState.Success : SynchronizationCompletedState.Failed, - message.Options.GroupedSynchronizationTrackingId)); - } + // await _notificationBuilder.CreateNotificationsAsync(accountInboxFolder.Id, synchronizationResult.DownloadedMessages); + // } + //} + //catch (AuthenticationAttentionException) + //{ + // await SetAccountAttentionAsync(accountId, AccountAttentionReason.InvalidCredentials); + //} + //catch (SystemFolderConfigurationMissingException) + //{ + // await SetAccountAttentionAsync(accountId, AccountAttentionReason.MissingSystemFolderConfiguration); + //} + //catch (OperationCanceledException) + //{ + // DialogService.InfoBarMessage(Translator.Info_SyncCanceledMessage, Translator.Info_SyncCanceledMessage, InfoBarMessageType.Warning); + //} + //catch (Exception ex) + //{ + // DialogService.InfoBarMessage(Translator.Info_SyncFailedTitle, ex.Message, InfoBarMessageType.Error); + //} + //finally + //{ + // if (shouldReportSynchronizationResult) + // Messenger.Send(new AccountSynchronizationCompleted(accountId, + // isSynchronizationSucceeded ? SynchronizationCompletedState.Success : SynchronizationCompletedState.Failed, + // message.Options.GroupedSynchronizationTrackingId)); + //} } diff --git a/Wino.Mail.ViewModels/MailListPageViewModel.cs b/Wino.Mail.ViewModels/MailListPageViewModel.cs index 1fb1fb2f..327741a3 100644 --- a/Wino.Mail.ViewModels/MailListPageViewModel.cs +++ b/Wino.Mail.ViewModels/MailListPageViewModel.cs @@ -72,7 +72,6 @@ namespace Wino.Mail.ViewModels private readonly IMailService _mailService; private readonly IFolderService _folderService; - private readonly IWinoSynchronizerFactory _winoSynchronizerFactory; private readonly IThreadingStrategyProvider _threadingStrategyProvider; private readonly IContextMenuItemService _contextMenuItemService; private readonly IWinoRequestDelegator _winoRequestDelegator; @@ -143,7 +142,6 @@ namespace Wino.Mail.ViewModels IMailService mailService, IStatePersistanceService statePersistanceService, IFolderService folderService, - IWinoSynchronizerFactory winoSynchronizerFactory, IThreadingStrategyProvider threadingStrategyProvider, IContextMenuItemService contextMenuItemService, IWinoRequestDelegator winoRequestDelegator, @@ -156,7 +154,6 @@ namespace Wino.Mail.ViewModels _mailService = mailService; _folderService = folderService; - _winoSynchronizerFactory = winoSynchronizerFactory; _threadingStrategyProvider = threadingStrategyProvider; _contextMenuItemService = contextMenuItemService; _winoRequestDelegator = winoRequestDelegator; @@ -977,17 +974,19 @@ namespace Wino.Mail.ViewModels foreach (var accountId in accountIds) { - var synchronizer = _winoSynchronizerFactory.GetAccountSynchronizer(accountId); + // TODO: Server: Check whether account is already synchronizing from the server. - if (synchronizer == null) continue; + //var synchronizer = _winoSynchronizerFactory.GetAccountSynchronizer(accountId); - bool isAccountSynchronizing = synchronizer.State != AccountSynchronizerState.Idle; + //if (synchronizer == null) continue; - if (isAccountSynchronizing) - { - isAnyAccountSynchronizing = true; - break; - } + //bool isAccountSynchronizing = synchronizer.State != AccountSynchronizerState.Idle; + + //if (isAccountSynchronizing) + //{ + // isAnyAccountSynchronizing = true; + // break; + //} } } diff --git a/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs b/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs index 0c44eda4..d710e384 100644 --- a/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs +++ b/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs @@ -37,7 +37,6 @@ namespace Wino.Mail.ViewModels private readonly IMimeFileService _mimeFileService; private readonly Core.Domain.Interfaces.IMailService _mailService; private readonly IFileService _fileService; - private readonly IWinoSynchronizerFactory _winoSynchronizerFactory; private readonly IWinoRequestDelegator _requestDelegator; private readonly IClipboardService _clipboardService; private readonly IUnsubscriptionService _unsubscriptionService; @@ -124,7 +123,6 @@ namespace Wino.Mail.ViewModels IMimeFileService mimeFileService, Core.Domain.Interfaces.IMailService mailService, IFileService fileService, - IWinoSynchronizerFactory winoSynchronizerFactory, IWinoRequestDelegator requestDelegator, IStatePersistanceService statePersistanceService, IClipboardService clipboardService, @@ -141,7 +139,6 @@ namespace Wino.Mail.ViewModels _mimeFileService = mimeFileService; _mailService = mailService; _fileService = fileService; - _winoSynchronizerFactory = winoSynchronizerFactory; _requestDelegator = requestDelegator; } @@ -344,30 +341,31 @@ namespace Wino.Mail.ViewModels } } - private async Task HandleSingleItemDownloadAsync(MailItemViewModel mailItemViewModel) { - var synchronizer = _winoSynchronizerFactory.GetAccountSynchronizer(mailItemViewModel.AssignedAccount.Id); + // TODO: Server: Download single mime and report back the item here. - try - { - // To show the progress on the UI. - CurrentDownloadPercentage = 1; + //var synchronizer = _winoSynchronizerFactory.GetAccountSynchronizer(mailItemViewModel.AssignedAccount.Id); - await synchronizer.DownloadMissingMimeMessageAsync(mailItemViewModel.MailCopy, this, renderCancellationTokenSource.Token); - } - catch (OperationCanceledException) - { - Log.Information("MIME download is canceled."); - } - catch (Exception ex) - { - DialogService.InfoBarMessage(Translator.GeneralTitle_Error, ex.Message, InfoBarMessageType.Error); - } - finally - { - ResetProgress(); - } + //try + //{ + // // To show the progress on the UI. + // CurrentDownloadPercentage = 1; + + // await synchronizer.DownloadMissingMimeMessageAsync(mailItemViewModel.MailCopy, this, renderCancellationTokenSource.Token); + //} + //catch (OperationCanceledException) + //{ + // Log.Information("MIME download is canceled."); + //} + //catch (Exception ex) + //{ + // DialogService.InfoBarMessage(Translator.GeneralTitle_Error, ex.Message, InfoBarMessageType.Error); + //} + //finally + //{ + // ResetProgress(); + //} } private async Task RenderAsync(MailItemViewModel mailItemViewModel, CancellationToken cancellationToken = default) diff --git a/Wino.Mail/Activation/BackgroundActivationHandler.cs b/Wino.Mail/Activation/BackgroundActivationHandler.cs index a8735dd7..2815276c 100644 --- a/Wino.Mail/Activation/BackgroundActivationHandler.cs +++ b/Wino.Mail/Activation/BackgroundActivationHandler.cs @@ -8,7 +8,6 @@ using Wino.Core.Domain; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.MailItem; -using Wino.Core.Domain.Models.Synchronization; using Wino.Core.UWP.Services; namespace Wino.Activation @@ -20,7 +19,7 @@ namespace Wino.Activation private readonly IWinoRequestDelegator _winoRequestDelegator; private readonly INativeAppService _nativeAppService; private readonly IWinoRequestProcessor _winoRequestProcessor; - private readonly IWinoSynchronizerFactory _winoSynchronizerFactory; + private readonly IWinoServerConnectionManager _winoServerConnectionManager; private readonly IMailService _mailService; private ToastArguments _toastArguments; @@ -28,13 +27,13 @@ namespace Wino.Activation public BackgroundActivationHandler(IWinoRequestDelegator winoRequestDelegator, INativeAppService nativeAppService, IWinoRequestProcessor winoRequestProcessor, - IWinoSynchronizerFactory winoSynchronizerFactory, + IWinoServerConnectionManager winoServerConnectionManager, IMailService mailService) { _winoRequestDelegator = winoRequestDelegator; _nativeAppService = nativeAppService; _winoRequestProcessor = winoRequestProcessor; - _winoSynchronizerFactory = winoSynchronizerFactory; + _winoServerConnectionManager = winoServerConnectionManager; _mailService = mailService; } @@ -78,23 +77,25 @@ namespace Wino.Activation { // We need to synchronize changes without reflection the UI changes. - var synchronizer = _winoSynchronizerFactory.GetAccountSynchronizer(mailItem.AssignedAccount.Id); + // var synchronizer = _winoSynchronizerFactory.GetAccountSynchronizer(mailItem.AssignedAccount.Id); var prepRequest = new MailOperationPreperationRequest(action, mailItem); var requests = await _winoRequestProcessor.PrepareRequestsAsync(prepRequest); foreach (var request in requests) { - synchronizer.QueueRequest(request); + _winoServerConnectionManager.QueueRequest(request, mailItem.AssignedAccount.Id); + + // synchronizer.QueueRequest(request); } - var options = new SynchronizationOptions() - { - Type = SynchronizationType.ExecuteRequests, - AccountId = mailItem.AssignedAccount.Id - }; + //var options = new SynchronizationOptions() + //{ + // Type = SynchronizationType.ExecuteRequests, + // AccountId = mailItem.AssignedAccount.Id + //}; - await synchronizer.SynchronizeAsync(options); + //await synchronizer.SynchronizeAsync(options); } } } diff --git a/Wino.Mail/App.xaml.cs b/Wino.Mail/App.xaml.cs index a65e2992..02de9c11 100644 --- a/Wino.Mail/App.xaml.cs +++ b/Wino.Mail/App.xaml.cs @@ -46,7 +46,6 @@ namespace Wino private readonly IThemeService _themeService; private readonly IDatabaseService _databaseService; private readonly IAppInitializerService _appInitializerService; - private readonly IWinoSynchronizerFactory _synchronizerFactory; private readonly ITranslationService _translationService; // Order matters. @@ -56,7 +55,6 @@ namespace Wino _appServiceConnectionManager, _translationService, _themeService, - _synchronizerFactory }; public App() @@ -83,7 +81,6 @@ namespace Wino _themeService = Services.GetService(); _databaseService = Services.GetService(); _appInitializerService = Services.GetService(); - _synchronizerFactory = Services.GetService(); _translationService = Services.GetService(); Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);