Skip to content

Code Quality: Break down service registration in App.xaml.cs into granular methods #13350

@jvestell

Description

@jvestell

Description

All Dependency Injection configurations are inside a single method. The ConfigureHost() method is becoming cumbersome and less manageable as services are added. I recommend an abbreviated ConfigureHost() method:

private IHost ConfigureHost()
{
return Host.CreateDefaultBuilder()
.UseEnvironment(ApplicationService.AppEnvironment.ToString())
.ConfigureLogging( /* ... / )
.ConfigureServices(ConfigureServices) // This is where the specific registration methods get called
*
.Build();
}

and improved orchestration and navigation offered by the following:

private void ConfigureServices(IServiceCollection services)
{
// General services
RegisterGeneralServices(services);

// Storage services
RegisterStorageServices(services);

// ViewModel services
RegisterViewModelServices(services);

// Additional services
RegisterAdditionalServices(services); // If you have more services to add

}

private void RegisterGeneralServices(IServiceCollection services)
{
services.AddSingleton<IUserSettingsService, UserSettingsService>();
// ... other general services
}

private void RegisterViewModelServices(IServiceCollection services)
{
services.AddSingleton();
// ... other ViewModel services
}

// other services

Concerned code

File: App.xaml.cs

	private IHost ConfigureHost()
	{
		return Host.CreateDefaultBuilder()
			.UseEnvironment(ApplicationService.AppEnvironment.ToString())
			.ConfigureLogging(builder => builder
				.AddProvider(new FileLoggerProvider(Path.Combine(ApplicationData.Current.LocalFolder.Path, "debug.log")))
				.SetMinimumLevel(LogLevel.Information))
			.ConfigureServices(services => services
				.AddSingleton<IUserSettingsService, UserSettingsService>()
				.AddSingleton<IAppearanceSettingsService, AppearanceSettingsService>(sp => new AppearanceSettingsService((sp.GetService<IUserSettingsService>() as UserSettingsService).GetSharingContext()))
				.AddSingleton<IGeneralSettingsService, GeneralSettingsService>(sp => new GeneralSettingsService((sp.GetService<IUserSettingsService>() as UserSettingsService).GetSharingContext()))
				.AddSingleton<IFoldersSettingsService, FoldersSettingsService>(sp => new FoldersSettingsService((sp.GetService<IUserSettingsService>() as UserSettingsService).GetSharingContext()))
				.AddSingleton<IApplicationSettingsService, ApplicationSettingsService>(sp => new ApplicationSettingsService((sp.GetService<IUserSettingsService>() as UserSettingsService).GetSharingContext()))
				.AddSingleton<IPreviewPaneSettingsService, PreviewPaneSettingsService>(sp => new PreviewPaneSettingsService((sp.GetService<IUserSettingsService>() as UserSettingsService).GetSharingContext()))
				.AddSingleton<ILayoutSettingsService, LayoutSettingsService>(sp => new LayoutSettingsService((sp.GetService<IUserSettingsService>() as UserSettingsService).GetSharingContext()))
				.AddSingleton<IAppSettingsService, AppSettingsService>(sp => new AppSettingsService((sp.GetService<IUserSettingsService>() as UserSettingsService).GetSharingContext()))
				.AddSingleton<IFileTagsSettingsService, FileTagsSettingsService>()
				.AddSingleton<IPageContext, PageContext>()
				.AddSingleton<IContentPageContext, ContentPageContext>()
				.AddSingleton<IDisplayPageContext, DisplayPageContext>()
				.AddSingleton<IWindowContext, WindowContext>()
				.AddSingleton<IMultitaskingContext, MultitaskingContext>()
				.AddSingleton<ITagsContext, TagsContext>()
				.AddSingleton<IDialogService, DialogService>()
				.AddSingleton<IImageService, ImagingService>()
				.AddSingleton<IThreadingService, ThreadingService>()
				.AddSingleton<ILocalizationService, LocalizationService>()
				.AddSingleton<ICloudDetector, CloudDetector>()
				.AddSingleton<IFileTagsService, FileTagsService>()
				.AddSingleton<ICommandManager, CommandManager>()
				.AddSingleton<IModifiableCommandManager, ModifiableCommandManager>()
				.AddSingleton<IApplicationService, ApplicationService>()

#if UWP
.AddSingleton<IStorageService, WindowsStorageService>()
#else
.AddSingleton<IStorageService, NativeStorageService>()
#endif
.AddSingleton<IFtpStorageService, FtpStorageService>()
.AddSingleton<IAddItemService, AddItemService>()
#if STABLE || PREVIEW
.AddSingleton<IUpdateService, SideloadUpdateService>()
#else
.AddSingleton<IUpdateService, UpdateService>()
#endif
.AddSingleton<IPreviewPopupService, PreviewPopupService>()
.AddSingleton<IDateTimeFormatterFactory, DateTimeFormatterFactory>()
.AddSingleton<IDateTimeFormatter, UserDateTimeFormatter>()
.AddSingleton<IVolumeInfoFactory, VolumeInfoFactory>()
.AddSingleton<ISizeProvider, UserSizeProvider>()
.AddSingleton<IQuickAccessService, QuickAccessService>()
.AddSingleton<IResourcesService, ResourcesService>()
.AddSingleton<IJumpListService, JumpListService>()
.AddSingleton<IRemovableDrivesService, RemovableDrivesService>()
.AddSingleton<INetworkDrivesService, NetworkDrivesService>()
.AddSingleton()
.AddSingleton()
.AddSingleton()
.AddSingleton()
.AddSingleton()
.AddSingleton()
.AddSingleton()
.AddSingleton()
.AddSingleton<IJsonValidator, JsonIntegrityChecker>()
).Build();
}

Gains

Breaking down service registration into smaller, focused methods improves the code's organization, readability, and maintainability.

Requirements

Refactoring IHost ConfigureHost()

Comments

No response

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

Status

✅ Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions