From 06a00cdfeffc7fc0063ae5842947381821e5695d Mon Sep 17 00:00:00 2001 From: Robert Dailey Date: Sat, 26 Oct 2024 11:30:04 -0500 Subject: [PATCH] refactor: Consolidate many Autofac module classes --- src/Recyclarr.Cli/CompositionRoot.cs | 88 +++--- .../Migration/MigrationAutofacModule.cs | 21 -- .../CustomFormat/CustomFormatAutofacModule.cs | 31 --- .../MediaNaming/MediaNamingAutofacModule.cs | 29 -- .../Pipelines/PipelineAutofacModule.cs | 121 ++++++++ .../QualityProfileAutofacModule.cs | 23 -- .../QualitySize/QualitySizeAutofacModule.cs | 34 --- .../ServiceProcessorsAutofacModule.cs | 37 --- .../Cache/CacheAutofacModule.cs | 11 - .../Common/CommonAutofacModule.cs | 14 - .../CompatibilityAutofacModule.cs | 25 -- .../Config/ConfigAutofacModule.cs | 66 ----- src/Recyclarr.Core/CoreAutofacModule.cs | 258 ++++++++++++++++++ src/Recyclarr.Core/Http/HttpAutofacModule.cs | 21 -- src/Recyclarr.Core/Json/JsonAutofacModule.cs | 23 -- .../NotificationsAutofacModule.cs | 27 -- .../Platform/PlatformAutofacModule.cs | 23 -- src/Recyclarr.Core/Repo/RepoAutofacModule.cs | 21 -- .../ServarrApi/ServarrApiAutofacModule.cs | 31 --- .../Settings/SettingsAutofacModule.cs | 19 -- .../TrashGuide/GuideAutofacModule.cs | 28 -- .../VersionControlAutofacModule.cs | 12 - src/Recyclarr.Core/Yaml/YamlAutofacModule.cs | 14 - .../IntegrationTestFixture.cs | 23 +- 24 files changed, 418 insertions(+), 582 deletions(-) delete mode 100644 src/Recyclarr.Cli/Migration/MigrationAutofacModule.cs delete mode 100644 src/Recyclarr.Cli/Pipelines/CustomFormat/CustomFormatAutofacModule.cs delete mode 100644 src/Recyclarr.Cli/Pipelines/MediaNaming/MediaNamingAutofacModule.cs create mode 100644 src/Recyclarr.Cli/Pipelines/PipelineAutofacModule.cs delete mode 100644 src/Recyclarr.Cli/Pipelines/QualityProfile/QualityProfileAutofacModule.cs delete mode 100644 src/Recyclarr.Cli/Pipelines/QualitySize/QualitySizeAutofacModule.cs delete mode 100644 src/Recyclarr.Cli/Processors/ServiceProcessorsAutofacModule.cs delete mode 100644 src/Recyclarr.Core/Cache/CacheAutofacModule.cs delete mode 100644 src/Recyclarr.Core/Common/CommonAutofacModule.cs delete mode 100644 src/Recyclarr.Core/Compatibility/CompatibilityAutofacModule.cs delete mode 100644 src/Recyclarr.Core/Config/ConfigAutofacModule.cs create mode 100644 src/Recyclarr.Core/CoreAutofacModule.cs delete mode 100644 src/Recyclarr.Core/Http/HttpAutofacModule.cs delete mode 100644 src/Recyclarr.Core/Json/JsonAutofacModule.cs delete mode 100644 src/Recyclarr.Core/Notifications/NotificationsAutofacModule.cs delete mode 100644 src/Recyclarr.Core/Platform/PlatformAutofacModule.cs delete mode 100644 src/Recyclarr.Core/Repo/RepoAutofacModule.cs delete mode 100644 src/Recyclarr.Core/ServarrApi/ServarrApiAutofacModule.cs delete mode 100644 src/Recyclarr.Core/Settings/SettingsAutofacModule.cs delete mode 100644 src/Recyclarr.Core/TrashGuide/GuideAutofacModule.cs delete mode 100644 src/Recyclarr.Core/VersionControl/VersionControlAutofacModule.cs delete mode 100644 src/Recyclarr.Core/Yaml/YamlAutofacModule.cs diff --git a/src/Recyclarr.Cli/CompositionRoot.cs b/src/Recyclarr.Cli/CompositionRoot.cs index 4817ad79..0615cf04 100644 --- a/src/Recyclarr.Cli/CompositionRoot.cs +++ b/src/Recyclarr.Cli/CompositionRoot.cs @@ -3,33 +3,18 @@ using System.Reflection; using Autofac; using Autofac.Extras.Ordering; using AutoMapper.Contrib.Autofac.DependencyInjection; -using Recyclarr.Cache; using Recyclarr.Cli.Console; using Recyclarr.Cli.Console.Setup; using Recyclarr.Cli.Logging; using Recyclarr.Cli.Migration; +using Recyclarr.Cli.Migration.Steps; using Recyclarr.Cli.Pipelines; -using Recyclarr.Cli.Pipelines.CustomFormat; -using Recyclarr.Cli.Pipelines.Generic; -using Recyclarr.Cli.Pipelines.MediaNaming; -using Recyclarr.Cli.Pipelines.QualityProfile; -using Recyclarr.Cli.Pipelines.QualitySize; -using Recyclarr.Cli.Processors; +using Recyclarr.Cli.Processors.Config; +using Recyclarr.Cli.Processors.Delete; +using Recyclarr.Cli.Processors.ErrorHandling; using Recyclarr.Cli.Processors.Sync; using Recyclarr.Common; -using Recyclarr.Compatibility; -using Recyclarr.Config; -using Recyclarr.Http; -using Recyclarr.Json; using Recyclarr.Logging; -using Recyclarr.Notifications; -using Recyclarr.Platform; -using Recyclarr.Repo; -using Recyclarr.ServarrApi; -using Recyclarr.Settings; -using Recyclarr.TrashGuide; -using Recyclarr.VersionControl; -using Recyclarr.Yaml; using Serilog.Core; using Spectre.Console.Cli; @@ -46,22 +31,8 @@ public static class CompositionRoot RegisterLogger(builder); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); + builder.RegisterModule(); + builder.RegisterModule(); builder.RegisterType().As(); builder.Register(_ => new ResourceDataReader(thisAssembly)).As(); @@ -69,26 +40,43 @@ public static class CompositionRoot builder.RegisterAutoMapper(thisAssembly); CliRegistrations(builder); - PipelineRegistrations(builder); + RegisterMigrations(builder); + RegisterServiceProcessors(builder); } - private static void PipelineRegistrations(ContainerBuilder builder) + private static void RegisterServiceProcessors(ContainerBuilder builder) { - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); + builder.RegisterType(); + builder.RegisterType(); - builder.RegisterGeneric(typeof(GenericPipelinePhases<>)); - builder.RegisterComposite(); + // Sync + builder.RegisterType().As(); + + // Configuration + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType(); + builder.RegisterType(); + + // Delete + builder.RegisterType().As(); + + builder.RegisterTypes( + typeof(TemplateConfigCreator), + typeof(LocalConfigCreator)) + .As() + .OrderByRegistration(); + } + + private static void RegisterMigrations(ContainerBuilder builder) + { + builder.RegisterType().As(); + + // Migration Steps builder.RegisterTypes( - // ORDER HERE IS IMPORTANT! - // There are indirect dependencies between pipelines. - typeof(GenericSyncPipeline), - typeof(GenericSyncPipeline), - typeof(GenericSyncPipeline), - typeof(GenericSyncPipeline)) - .As() + typeof(MoveOsxAppDataDotnet8), + typeof(DeleteRepoDirMigrationStep)) + .As() .OrderByRegistration(); } diff --git a/src/Recyclarr.Cli/Migration/MigrationAutofacModule.cs b/src/Recyclarr.Cli/Migration/MigrationAutofacModule.cs deleted file mode 100644 index 1dfb49ef..00000000 --- a/src/Recyclarr.Cli/Migration/MigrationAutofacModule.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Autofac; -using Autofac.Extras.Ordering; -using Recyclarr.Cli.Migration.Steps; - -namespace Recyclarr.Cli.Migration; - -public class MigrationAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - base.Load(builder); - builder.RegisterType().As(); - - // Migration Steps - builder.RegisterTypes( - typeof(MoveOsxAppDataDotnet8), - typeof(DeleteRepoDirMigrationStep)) - .As() - .OrderByRegistration(); - } -} diff --git a/src/Recyclarr.Cli/Pipelines/CustomFormat/CustomFormatAutofacModule.cs b/src/Recyclarr.Cli/Pipelines/CustomFormat/CustomFormatAutofacModule.cs deleted file mode 100644 index 6e7a0319..00000000 --- a/src/Recyclarr.Cli/Pipelines/CustomFormat/CustomFormatAutofacModule.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Autofac; -using Recyclarr.Cache; -using Recyclarr.Cli.Pipelines.CustomFormat.Cache; -using Recyclarr.Cli.Pipelines.CustomFormat.Models; -using Recyclarr.Cli.Pipelines.CustomFormat.PipelinePhases; - -namespace Recyclarr.Cli.Pipelines.CustomFormat; - -public class CustomFormatAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - builder.RegisterType() - .As() - .AsSelf() - .InstancePerLifetimeScope(); - - builder.RegisterType(); - builder.RegisterType().As>(); - builder.RegisterType(); - - builder.RegisterTypes( - typeof(CustomFormatConfigPhase), - typeof(CustomFormatApiFetchPhase), - typeof(CustomFormatTransactionPhase), - typeof(CustomFormatPreviewPhase), - typeof(CustomFormatApiPersistencePhase), - typeof(CustomFormatLogPhase)) - .AsImplementedInterfaces(); - } -} diff --git a/src/Recyclarr.Cli/Pipelines/MediaNaming/MediaNamingAutofacModule.cs b/src/Recyclarr.Cli/Pipelines/MediaNaming/MediaNamingAutofacModule.cs deleted file mode 100644 index a7eba928..00000000 --- a/src/Recyclarr.Cli/Pipelines/MediaNaming/MediaNamingAutofacModule.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Autofac; -using Recyclarr.Cli.Pipelines.MediaNaming.PipelinePhases; -using Recyclarr.Cli.Pipelines.MediaNaming.PipelinePhases.Config; -using Recyclarr.TrashGuide; - -namespace Recyclarr.Cli.Pipelines.MediaNaming; - -public class MediaNamingAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - base.Load(builder); - builder.RegisterType(); - - builder.RegisterType() - .Keyed(SupportedServices.Radarr); - builder.RegisterType() - .Keyed(SupportedServices.Sonarr); - - builder.RegisterTypes( - typeof(MediaNamingConfigPhase), - typeof(MediaNamingApiFetchPhase), - typeof(MediaNamingTransactionPhase), - typeof(MediaNamingPreviewPhase), - typeof(MediaNamingApiPersistencePhase), - typeof(MediaNamingLogPhase)) - .AsImplementedInterfaces(); - } -} diff --git a/src/Recyclarr.Cli/Pipelines/PipelineAutofacModule.cs b/src/Recyclarr.Cli/Pipelines/PipelineAutofacModule.cs new file mode 100644 index 00000000..3798f9a5 --- /dev/null +++ b/src/Recyclarr.Cli/Pipelines/PipelineAutofacModule.cs @@ -0,0 +1,121 @@ +using Autofac; +using Autofac.Extras.Ordering; +using Recyclarr.Cache; +using Recyclarr.Cli.Pipelines.CustomFormat; +using Recyclarr.Cli.Pipelines.CustomFormat.Cache; +using Recyclarr.Cli.Pipelines.CustomFormat.Models; +using Recyclarr.Cli.Pipelines.CustomFormat.PipelinePhases; +using Recyclarr.Cli.Pipelines.Generic; +using Recyclarr.Cli.Pipelines.MediaNaming; +using Recyclarr.Cli.Pipelines.MediaNaming.PipelinePhases; +using Recyclarr.Cli.Pipelines.MediaNaming.PipelinePhases.Config; +using Recyclarr.Cli.Pipelines.QualityProfile; +using Recyclarr.Cli.Pipelines.QualityProfile.PipelinePhases; +using Recyclarr.Cli.Pipelines.QualitySize; +using Recyclarr.Cli.Pipelines.QualitySize.PipelinePhases; +using Recyclarr.Cli.Pipelines.QualitySize.PipelinePhases.Limits; +using Recyclarr.Cli.Processors.Sync; +using Recyclarr.TrashGuide; +using Recyclarr.TrashGuide.QualitySize; + +namespace Recyclarr.Cli.Pipelines; + +public class PipelineAutofacModule : Module +{ + protected override void Load(ContainerBuilder builder) + { + builder.RegisterGeneric(typeof(GenericPipelinePhases<>)); + builder.RegisterComposite(); + builder.RegisterTypes( + // ORDER HERE IS IMPORTANT! + // There are indirect dependencies between pipelines. + typeof(GenericSyncPipeline), + typeof(GenericSyncPipeline), + typeof(GenericSyncPipeline), + typeof(GenericSyncPipeline)) + .As() + .OrderByRegistration(); + + RegisterQualityProfile(builder); + RegisterQualitySize(builder); + RegisterCustomFormat(builder); + RegisterMediaNaming(builder); + } + + private static void RegisterMediaNaming(ContainerBuilder builder) + { + builder.RegisterType(); + + builder.RegisterType() + .Keyed(SupportedServices.Radarr); + builder.RegisterType() + .Keyed(SupportedServices.Sonarr); + + builder.RegisterTypes( + typeof(MediaNamingConfigPhase), + typeof(MediaNamingApiFetchPhase), + typeof(MediaNamingTransactionPhase), + typeof(MediaNamingPreviewPhase), + typeof(MediaNamingApiPersistencePhase), + typeof(MediaNamingLogPhase)) + .AsImplementedInterfaces(); + } + + private static void RegisterQualityProfile(ContainerBuilder builder) + { + builder.RegisterType(); + + builder.RegisterTypes( + typeof(QualityProfileConfigPhase), + typeof(QualityProfilePreviewPhase), + typeof(QualityProfileApiFetchPhase), + typeof(QualityProfileTransactionPhase), + typeof(QualityProfileApiPersistencePhase), + typeof(QualityProfileLogPhase)) + .AsImplementedInterfaces(); + } + + private static void RegisterQualitySize(ContainerBuilder builder) + { + builder.RegisterType(); + + // Setup factory for creation of concrete IQualityItemLimits types + builder.RegisterType().As(); + builder.RegisterType() + .Keyed(SupportedServices.Radarr) + .InstancePerLifetimeScope(); + builder.RegisterType() + .Keyed(SupportedServices.Sonarr) + .InstancePerLifetimeScope(); + + builder.RegisterTypes( + typeof(QualitySizeConfigPhase), + typeof(QualitySizePreviewPhase), + typeof(QualitySizeApiFetchPhase), + typeof(QualitySizeTransactionPhase), + typeof(QualitySizeApiPersistencePhase), + typeof(QualitySizeLogPhase)) + .AsImplementedInterfaces(); + } + + private static void RegisterCustomFormat(ContainerBuilder builder) + { + builder.RegisterType() + .As() + .AsSelf() + .InstancePerLifetimeScope(); + + builder.RegisterType(); + builder.RegisterType().As>(); + builder.RegisterType(); + + builder.RegisterTypes( + typeof(CustomFormatConfigPhase), + typeof(CustomFormatApiFetchPhase), + typeof(CustomFormatTransactionPhase), + typeof(CustomFormatPreviewPhase), + typeof(CustomFormatApiPersistencePhase), + typeof(CustomFormatLogPhase)) + .AsImplementedInterfaces(); + } +} diff --git a/src/Recyclarr.Cli/Pipelines/QualityProfile/QualityProfileAutofacModule.cs b/src/Recyclarr.Cli/Pipelines/QualityProfile/QualityProfileAutofacModule.cs deleted file mode 100644 index 63261213..00000000 --- a/src/Recyclarr.Cli/Pipelines/QualityProfile/QualityProfileAutofacModule.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Autofac; -using Recyclarr.Cli.Pipelines.QualityProfile.PipelinePhases; - -namespace Recyclarr.Cli.Pipelines.QualityProfile; - -public class QualityProfileAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - base.Load(builder); - - builder.RegisterType(); - - builder.RegisterTypes( - typeof(QualityProfileConfigPhase), - typeof(QualityProfilePreviewPhase), - typeof(QualityProfileApiFetchPhase), - typeof(QualityProfileTransactionPhase), - typeof(QualityProfileApiPersistencePhase), - typeof(QualityProfileLogPhase)) - .AsImplementedInterfaces(); - } -} diff --git a/src/Recyclarr.Cli/Pipelines/QualitySize/QualitySizeAutofacModule.cs b/src/Recyclarr.Cli/Pipelines/QualitySize/QualitySizeAutofacModule.cs deleted file mode 100644 index 8047878d..00000000 --- a/src/Recyclarr.Cli/Pipelines/QualitySize/QualitySizeAutofacModule.cs +++ /dev/null @@ -1,34 +0,0 @@ -using Autofac; -using Recyclarr.Cli.Pipelines.QualitySize.PipelinePhases; -using Recyclarr.Cli.Pipelines.QualitySize.PipelinePhases.Limits; -using Recyclarr.TrashGuide; -using Recyclarr.TrashGuide.QualitySize; - -namespace Recyclarr.Cli.Pipelines.QualitySize; - -public class QualitySizeAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - base.Load(builder); - builder.RegisterType(); - - // Setup factory for creation of concrete IQualityItemLimits types - builder.RegisterType().As(); - builder.RegisterType() - .Keyed(SupportedServices.Radarr) - .InstancePerLifetimeScope(); - builder.RegisterType() - .Keyed(SupportedServices.Sonarr) - .InstancePerLifetimeScope(); - - builder.RegisterTypes( - typeof(QualitySizeConfigPhase), - typeof(QualitySizePreviewPhase), - typeof(QualitySizeApiFetchPhase), - typeof(QualitySizeTransactionPhase), - typeof(QualitySizeApiPersistencePhase), - typeof(QualitySizeLogPhase)) - .AsImplementedInterfaces(); - } -} diff --git a/src/Recyclarr.Cli/Processors/ServiceProcessorsAutofacModule.cs b/src/Recyclarr.Cli/Processors/ServiceProcessorsAutofacModule.cs deleted file mode 100644 index c13e8dee..00000000 --- a/src/Recyclarr.Cli/Processors/ServiceProcessorsAutofacModule.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Autofac; -using Autofac.Extras.Ordering; -using Recyclarr.Cli.Processors.Config; -using Recyclarr.Cli.Processors.Delete; -using Recyclarr.Cli.Processors.ErrorHandling; -using Recyclarr.Cli.Processors.Sync; - -namespace Recyclarr.Cli.Processors; - -public class ServiceProcessorsAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - base.Load(builder); - - builder.RegisterType(); - builder.RegisterType(); - - // Sync - builder.RegisterType().As(); - - // Configuration - builder.RegisterType().As(); - builder.RegisterType().As(); - builder.RegisterType(); - builder.RegisterType(); - - // Delete - builder.RegisterType().As(); - - builder.RegisterTypes( - typeof(TemplateConfigCreator), - typeof(LocalConfigCreator)) - .As() - .OrderByRegistration(); - } -} diff --git a/src/Recyclarr.Core/Cache/CacheAutofacModule.cs b/src/Recyclarr.Core/Cache/CacheAutofacModule.cs deleted file mode 100644 index 7cded8cc..00000000 --- a/src/Recyclarr.Core/Cache/CacheAutofacModule.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Autofac; - -namespace Recyclarr.Cache; - -public class CacheAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - builder.RegisterType().As(); - } -} diff --git a/src/Recyclarr.Core/Common/CommonAutofacModule.cs b/src/Recyclarr.Core/Common/CommonAutofacModule.cs deleted file mode 100644 index 71bd5557..00000000 --- a/src/Recyclarr.Core/Common/CommonAutofacModule.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Autofac; -using Recyclarr.Common.FluentValidation; - -namespace Recyclarr.Common; - -public class CommonAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - base.Load(builder); - builder.RegisterType().As(); - builder.RegisterType(); - } -} diff --git a/src/Recyclarr.Core/Compatibility/CompatibilityAutofacModule.cs b/src/Recyclarr.Core/Compatibility/CompatibilityAutofacModule.cs deleted file mode 100644 index b33132c2..00000000 --- a/src/Recyclarr.Core/Compatibility/CompatibilityAutofacModule.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Autofac; -using Recyclarr.Compatibility.Radarr; -using Recyclarr.Compatibility.Sonarr; - -namespace Recyclarr.Compatibility; - -public class CompatibilityAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - base.Load(builder); - - builder.RegisterType(); - builder.RegisterType().As() - .InstancePerLifetimeScope(); - - // Sonarr - builder.RegisterType().As(); - builder.RegisterType(); - - // Radarr - builder.RegisterType().As(); - builder.RegisterType(); - } -} diff --git a/src/Recyclarr.Core/Config/ConfigAutofacModule.cs b/src/Recyclarr.Core/Config/ConfigAutofacModule.cs deleted file mode 100644 index 2ab04a25..00000000 --- a/src/Recyclarr.Core/Config/ConfigAutofacModule.cs +++ /dev/null @@ -1,66 +0,0 @@ -using Autofac; -using Autofac.Extras.Ordering; -using AutoMapper.Contrib.Autofac.DependencyInjection; -using FluentValidation; -using Recyclarr.Config.Parsing; -using Recyclarr.Config.Parsing.PostProcessing; -using Recyclarr.Config.Parsing.PostProcessing.ConfigMerging; -using Recyclarr.Config.Parsing.PostProcessing.Deprecations; -using Recyclarr.Config.Secrets; -using Recyclarr.Yaml; - -namespace Recyclarr.Config; - -public class ConfigAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - builder.RegisterAutoMapper(ThisAssembly); - - builder.RegisterAssemblyTypes(ThisAssembly) - .AssignableTo() - .As(); - - builder.RegisterType().As().SingleInstance(); - builder.RegisterType().As(); - builder.RegisterType().As(); - builder.RegisterType().As(); - builder.RegisterType().As(); - builder.RegisterType(); - builder.RegisterType(); - builder.RegisterType(); - builder.RegisterType(); - - // Keyed include processors - builder.RegisterType().Keyed(typeof(ConfigYamlInclude)); - builder.RegisterType().Keyed(typeof(TemplateYamlInclude)); - - // Config Post Processors - builder.RegisterTypes( - // Order-sensitive! - typeof(ConfigDeprecationPostProcessor), - typeof(ImplicitUrlAndKeyPostProcessor), - typeof(IncludePostProcessor)) - .As() - .OrderByRegistration(); - - // Config Deprecations - builder.RegisterType(); - builder.RegisterTypes( - // Order-sensitive! - typeof(CfQualityProfilesDeprecationCheck)) - .As() - .OrderByRegistration(); - - RegisterValidators(builder); - } - - private static void RegisterValidators(ContainerBuilder builder) - { - builder.RegisterType().As(); - - // These validators are required by IncludePostProcessor - builder.RegisterType().As(); - builder.RegisterType().As(); - } -} diff --git a/src/Recyclarr.Core/CoreAutofacModule.cs b/src/Recyclarr.Core/CoreAutofacModule.cs new file mode 100644 index 00000000..9215994e --- /dev/null +++ b/src/Recyclarr.Core/CoreAutofacModule.cs @@ -0,0 +1,258 @@ +using System.Text.Json; +using Autofac; +using Autofac.Extras.Ordering; +using AutoMapper.Contrib.Autofac.DependencyInjection; +using FluentValidation; +using Flurl.Http.Configuration; +using Recyclarr.Cache; +using Recyclarr.Common.FluentValidation; +using Recyclarr.Compatibility; +using Recyclarr.Compatibility.Radarr; +using Recyclarr.Compatibility.Sonarr; +using Recyclarr.Config; +using Recyclarr.Config.Parsing; +using Recyclarr.Config.Parsing.PostProcessing; +using Recyclarr.Config.Parsing.PostProcessing.ConfigMerging; +using Recyclarr.Config.Parsing.PostProcessing.Deprecations; +using Recyclarr.Config.Secrets; +using Recyclarr.Http; +using Recyclarr.Json.Loading; +using Recyclarr.Logging; +using Recyclarr.Notifications; +using Recyclarr.Notifications.Apprise; +using Recyclarr.Platform; +using Recyclarr.Repo; +using Recyclarr.ServarrApi; +using Recyclarr.ServarrApi.CustomFormat; +using Recyclarr.ServarrApi.MediaNaming; +using Recyclarr.ServarrApi.QualityDefinition; +using Recyclarr.ServarrApi.QualityProfile; +using Recyclarr.ServarrApi.System; +using Recyclarr.Settings; +using Recyclarr.TrashGuide; +using Recyclarr.TrashGuide.CustomFormat; +using Recyclarr.TrashGuide.MediaNaming; +using Recyclarr.TrashGuide.QualitySize; +using Recyclarr.VersionControl; +using Recyclarr.Yaml; +using YamlDotNet.Serialization; +using YamlDotNet.Serialization.ObjectFactories; + +namespace Recyclarr; + +public class CoreAutofacModule : Module +{ + protected override void Load(ContainerBuilder builder) + { + RegisterCache(builder); + RegisterCommon(builder); + RegisterCompatibility(builder); + RegisterConfig(builder); + RegisterHttp(builder); + RegisterJson(builder); + RegisterNotifications(builder); + RegisterPlatform(builder); + RegisterRepo(builder); + RegisterServarrApi(builder); + RegisterSettings(builder); + RegisterTrashGuide(builder); + RegisterYaml(builder); + RegisterVersionControl(builder); + } + + private static void RegisterCache(ContainerBuilder builder) + { + builder.RegisterType().As(); + } + + private static void RegisterCommon(ContainerBuilder builder) + { + builder.RegisterType().As(); + builder.RegisterType(); + } + + private static void RegisterCompatibility(ContainerBuilder builder) + { + builder.RegisterType(); + builder.RegisterType().As() + .InstancePerLifetimeScope(); + + // Sonarr + builder.RegisterType().As(); + builder.RegisterType(); + + // Radarr + builder.RegisterType().As(); + builder.RegisterType(); + } + + private void RegisterConfig(ContainerBuilder builder) + { + builder.RegisterAutoMapper(ThisAssembly); + + builder.RegisterAssemblyTypes(ThisAssembly) + .AssignableTo() + .As(); + + builder.RegisterType().As().SingleInstance(); + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType(); + builder.RegisterType(); + builder.RegisterType(); + builder.RegisterType(); + + // Keyed include processors + builder.RegisterType().Keyed(typeof(ConfigYamlInclude)); + builder.RegisterType().Keyed(typeof(TemplateYamlInclude)); + + // Config Post Processors + builder.RegisterTypes( + // Order-sensitive! + typeof(ConfigDeprecationPostProcessor), + typeof(ImplicitUrlAndKeyPostProcessor), + typeof(IncludePostProcessor)) + .As() + .OrderByRegistration(); + + // Config Deprecations + builder.RegisterType(); + builder.RegisterTypes( + // Order-sensitive! + typeof(CfQualityProfilesDeprecationCheck)) + .As() + .OrderByRegistration(); + + builder.RegisterType().As(); + + // These validators are required by IncludePostProcessor + builder.RegisterType().As(); + builder.RegisterType().As(); + } + + private static void RegisterHttp(ContainerBuilder builder) + { + builder.RegisterType() + .As() + .SingleInstance(); + + builder.RegisterTypes( + typeof(FlurlAfterCallLogRedactor), + typeof(FlurlBeforeCallLogRedactor), + typeof(FlurlRedirectPreventer)) + .As(); + } + + private static void RegisterJson(ContainerBuilder builder) + { + builder.Register>(c => + { + return settings => new BulkJsonLoader(c.Resolve(), settings); + }); + + // Decorators for BulkJsonLoader. We do not use RegisterDecorator() here for these reasons: + // - We consume the BulkJsonLoader as a delegate factory, not by instance + // - We do not want all implementations of BulkJsonLoader to be decorated, only a specific implementation. + builder.RegisterType(); + builder.RegisterType(); + } + + private static void RegisterNotifications(ContainerBuilder builder) + { + builder.RegisterType().As(); + builder.RegisterType().SingleInstance(); + builder.RegisterType().SingleInstance(); + + // Apprise + builder.RegisterType() + .Keyed(AppriseMode.Stateful); + + builder.RegisterType() + .Keyed(AppriseMode.Stateless); + + builder.RegisterType().As(); + } + + private static void RegisterPlatform(ContainerBuilder builder) + { + builder.RegisterType().As().AsSelf().SingleInstance(); + builder.RegisterType().As(); + builder.RegisterType().As(); + + builder.Register(c => c.Resolve().CreateAppPaths()) + .As() + .SingleInstance(); + } + + private static void RegisterRepo(ContainerBuilder builder) + { + // Unique Repo Registrations + builder.RegisterType().As().As(); + builder.RegisterType().As().As(); + + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As(); + } + + private static void RegisterServarrApi(ContainerBuilder builder) + { + // This is used by all specific API service classes registered below. + builder.RegisterType().As(); + + builder.RegisterType().As() + .InstancePerLifetimeScope(); + + builder.RegisterType().As() + .InstancePerLifetimeScope(); + builder.RegisterType().As() + .InstancePerLifetimeScope(); + builder.RegisterType().As() + .InstancePerLifetimeScope(); + builder.RegisterType().As() + .InstancePerLifetimeScope(); + } + + private static void RegisterSettings(ContainerBuilder builder) + { + builder.RegisterType(); + builder.RegisterType().SingleInstance(); + + builder.RegisterSettings(x => x); + builder.RegisterSettings(x => x.LogJanitor); + builder.RegisterSettings(x => x.Repositories.ConfigTemplates); + builder.RegisterSettings(x => x.Repositories.TrashGuides); + builder.RegisterSettings(x => x.Notifications); + } + + private static void RegisterTrashGuide(ContainerBuilder builder) + { + builder.RegisterType().As().SingleInstance(); + + // Custom Format + builder.RegisterType().As().SingleInstance(); + builder.RegisterType().As(); + builder.RegisterType().As(); + + // Quality Size + builder.RegisterType().As().SingleInstance(); + builder.RegisterType(); + + // Media Naming + builder.RegisterType().As(); + } + + private static void RegisterYaml(ContainerBuilder builder) + { + builder.RegisterType().As(); + builder.RegisterType().As(); + } + + private static void RegisterVersionControl(ContainerBuilder builder) + { + builder.RegisterType().As(); + } +} diff --git a/src/Recyclarr.Core/Http/HttpAutofacModule.cs b/src/Recyclarr.Core/Http/HttpAutofacModule.cs deleted file mode 100644 index 2a026d14..00000000 --- a/src/Recyclarr.Core/Http/HttpAutofacModule.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Autofac; -using Flurl.Http.Configuration; - -namespace Recyclarr.Http; - -public class HttpAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - base.Load(builder); - builder.RegisterType() - .As() - .SingleInstance(); - - builder.RegisterTypes( - typeof(FlurlAfterCallLogRedactor), - typeof(FlurlBeforeCallLogRedactor), - typeof(FlurlRedirectPreventer)) - .As(); - } -} diff --git a/src/Recyclarr.Core/Json/JsonAutofacModule.cs b/src/Recyclarr.Core/Json/JsonAutofacModule.cs deleted file mode 100644 index 9b7561c1..00000000 --- a/src/Recyclarr.Core/Json/JsonAutofacModule.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Text.Json; -using Autofac; -using Recyclarr.Json.Loading; - -namespace Recyclarr.Json; - -public class JsonAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - base.Load(builder); - builder.Register>(c => - { - return settings => new BulkJsonLoader(c.Resolve(), settings); - }); - - // Decorators for BulkJsonLoader. We do not use RegisterDecorator() here for these reasons: - // - We consume the BulkJsonLoader as a delegate factory, not by instance - // - We do not want all implementations of BulkJsonLoader to be decorated, only a specific implementation. - builder.RegisterType(); - builder.RegisterType(); - } -} diff --git a/src/Recyclarr.Core/Notifications/NotificationsAutofacModule.cs b/src/Recyclarr.Core/Notifications/NotificationsAutofacModule.cs deleted file mode 100644 index 094bf0fa..00000000 --- a/src/Recyclarr.Core/Notifications/NotificationsAutofacModule.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Autofac; -using Recyclarr.Logging; -using Recyclarr.Notifications.Apprise; -using Recyclarr.Settings; - -namespace Recyclarr.Notifications; - -public class NotificationsAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - base.Load(builder); - - builder.RegisterType().As(); - builder.RegisterType().SingleInstance(); - builder.RegisterType().SingleInstance(); - - // Apprise - builder.RegisterType() - .Keyed(AppriseMode.Stateful); - - builder.RegisterType() - .Keyed(AppriseMode.Stateless); - - builder.RegisterType().As(); - } -} diff --git a/src/Recyclarr.Core/Platform/PlatformAutofacModule.cs b/src/Recyclarr.Core/Platform/PlatformAutofacModule.cs deleted file mode 100644 index 39bc5d9c..00000000 --- a/src/Recyclarr.Core/Platform/PlatformAutofacModule.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Autofac; - -namespace Recyclarr.Platform; - -public class PlatformAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - base.Load(builder); - RegisterAppPaths(builder); - } - - private static void RegisterAppPaths(ContainerBuilder builder) - { - builder.RegisterType().As().AsSelf().SingleInstance(); - builder.RegisterType().As(); - builder.RegisterType().As(); - - builder.Register(c => c.Resolve().CreateAppPaths()) - .As() - .SingleInstance(); - } -} diff --git a/src/Recyclarr.Core/Repo/RepoAutofacModule.cs b/src/Recyclarr.Core/Repo/RepoAutofacModule.cs deleted file mode 100644 index 059155d1..00000000 --- a/src/Recyclarr.Core/Repo/RepoAutofacModule.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Autofac; -using Recyclarr.VersionControl; - -namespace Recyclarr.Repo; - -public class RepoAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - base.Load(builder); - - // Unique Repo Registrations - builder.RegisterType().As().As(); - builder.RegisterType().As().As(); - - builder.RegisterType().As(); - builder.RegisterType().As(); - builder.RegisterType().As().InstancePerLifetimeScope(); - builder.RegisterType().As(); - } -} diff --git a/src/Recyclarr.Core/ServarrApi/ServarrApiAutofacModule.cs b/src/Recyclarr.Core/ServarrApi/ServarrApiAutofacModule.cs deleted file mode 100644 index 0e7038d8..00000000 --- a/src/Recyclarr.Core/ServarrApi/ServarrApiAutofacModule.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Autofac; -using Recyclarr.ServarrApi.CustomFormat; -using Recyclarr.ServarrApi.MediaNaming; -using Recyclarr.ServarrApi.QualityDefinition; -using Recyclarr.ServarrApi.QualityProfile; -using Recyclarr.ServarrApi.System; - -namespace Recyclarr.ServarrApi; - -public class ServarrApiAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - base.Load(builder); - - // This is used by all specific API service classes registered below. - builder.RegisterType().As(); - - builder.RegisterType().As() - .InstancePerLifetimeScope(); - - builder.RegisterType().As() - .InstancePerLifetimeScope(); - builder.RegisterType().As() - .InstancePerLifetimeScope(); - builder.RegisterType().As() - .InstancePerLifetimeScope(); - builder.RegisterType().As() - .InstancePerLifetimeScope(); - } -} diff --git a/src/Recyclarr.Core/Settings/SettingsAutofacModule.cs b/src/Recyclarr.Core/Settings/SettingsAutofacModule.cs deleted file mode 100644 index b1014cfc..00000000 --- a/src/Recyclarr.Core/Settings/SettingsAutofacModule.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Autofac; - -namespace Recyclarr.Settings; - -public class SettingsAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - base.Load(builder); - builder.RegisterType(); - builder.RegisterType().SingleInstance(); - - builder.RegisterSettings(x => x); - builder.RegisterSettings(x => x.LogJanitor); - builder.RegisterSettings(x => x.Repositories.ConfigTemplates); - builder.RegisterSettings(x => x.Repositories.TrashGuides); - builder.RegisterSettings(x => x.Notifications); - } -} diff --git a/src/Recyclarr.Core/TrashGuide/GuideAutofacModule.cs b/src/Recyclarr.Core/TrashGuide/GuideAutofacModule.cs deleted file mode 100644 index 02969432..00000000 --- a/src/Recyclarr.Core/TrashGuide/GuideAutofacModule.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Autofac; -using Recyclarr.TrashGuide.CustomFormat; -using Recyclarr.TrashGuide.MediaNaming; -using Recyclarr.TrashGuide.QualitySize; - -namespace Recyclarr.TrashGuide; - -public class GuideAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - base.Load(builder); - - builder.RegisterType().As().SingleInstance(); - - // Custom Format - builder.RegisterType().As().SingleInstance(); - builder.RegisterType().As(); - builder.RegisterType().As(); - - // Quality Size - builder.RegisterType().As().SingleInstance(); - builder.RegisterType(); - - // Media Naming - builder.RegisterType().As(); - } -} diff --git a/src/Recyclarr.Core/VersionControl/VersionControlAutofacModule.cs b/src/Recyclarr.Core/VersionControl/VersionControlAutofacModule.cs deleted file mode 100644 index 6c7d5eee..00000000 --- a/src/Recyclarr.Core/VersionControl/VersionControlAutofacModule.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Autofac; - -namespace Recyclarr.VersionControl; - -public class VersionControlAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - builder.RegisterType().As(); - base.Load(builder); - } -} diff --git a/src/Recyclarr.Core/Yaml/YamlAutofacModule.cs b/src/Recyclarr.Core/Yaml/YamlAutofacModule.cs deleted file mode 100644 index 17c6dbb4..00000000 --- a/src/Recyclarr.Core/Yaml/YamlAutofacModule.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Autofac; -using YamlDotNet.Serialization; -using YamlDotNet.Serialization.ObjectFactories; - -namespace Recyclarr.Yaml; - -public class YamlAutofacModule : Module -{ - protected override void Load(ContainerBuilder builder) - { - builder.RegisterType().As(); - builder.RegisterType().As(); - } -} diff --git a/tests/Recyclarr.IntegrationTests/IntegrationTestFixture.cs b/tests/Recyclarr.IntegrationTests/IntegrationTestFixture.cs index 55dd8a85..40d8583b 100644 --- a/tests/Recyclarr.IntegrationTests/IntegrationTestFixture.cs +++ b/tests/Recyclarr.IntegrationTests/IntegrationTestFixture.cs @@ -2,20 +2,11 @@ using Autofac; using Autofac.Extras.Ordering; using Autofac.Features.ResolveAnything; -using Recyclarr.Common; using Recyclarr.Compatibility; -using Recyclarr.Config; -using Recyclarr.Http; -using Recyclarr.Json; using Recyclarr.Platform; -using Recyclarr.Repo; -using Recyclarr.ServarrApi; -using Recyclarr.Settings; using Recyclarr.TestLibrary; using Recyclarr.TestLibrary.Autofac; -using Recyclarr.TrashGuide; using Recyclarr.VersionControl; -using Recyclarr.Yaml; using Spectre.Console; using Spectre.Console.Testing; @@ -59,19 +50,7 @@ public abstract class IntegrationTestFixture : IDisposable { // Needed for Autofac.Extras.Ordering builder.RegisterSource(); - - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); - builder.RegisterModule(); + builder.RegisterModule(); } ///