using System.IO.Abstractions; using System.Reflection; using Autofac; using Autofac.Extras.Ordering; using AutoMapper.Contrib.Autofac.DependencyInjection; using Recyclarr.Cli.Cache; using Recyclarr.Cli.Console.Setup; using Recyclarr.Cli.Logging; using Recyclarr.Cli.Migration; 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.Common; using Recyclarr.Compatibility; using Recyclarr.Config; using Recyclarr.Json; 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; namespace Recyclarr.Cli; public static class CompositionRoot { public static void Setup(ContainerBuilder builder) { var thisAssembly = typeof(CompositionRoot).Assembly; // Needed for Autofac.Extras.Ordering builder.RegisterSource(); 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.RegisterType().As(); builder.Register(_ => new ResourceDataReader(thisAssembly)).As(); builder.RegisterAutoMapper(thisAssembly); CommandRegistrations(builder); PipelineRegistrations(builder); } private static void PipelineRegistrations(ContainerBuilder builder) { builder.RegisterModule(); builder.RegisterModule(); builder.RegisterModule(); builder.RegisterModule(); builder.RegisterGeneric(typeof(GenericPipelinePhases<>)); builder.RegisterTypes( // ORDER HERE IS IMPORTANT! // There are indirect dependencies between pipelines. typeof(GenericSyncPipeline), typeof(GenericSyncPipeline), typeof(GenericSyncPipeline), typeof(GenericSyncPipeline)) .As() .OrderByRegistration(); } private static void RegisterLogger(ContainerBuilder builder) { builder.RegisterType().As(); builder.RegisterType(); builder.Register(c => c.Resolve().Create()).As().SingleInstance(); } private static void CommandRegistrations(ContainerBuilder builder) { builder.RegisterTypes( typeof(AppPathSetupTask), typeof(JanitorCleanupTask)) .As() .OrderByRegistration(); builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()) .AssignableTo(); } public static void RegisterExternal( ContainerBuilder builder, LoggingLevelSwitch logLevelSwitch, AppDataPathProvider appDataPathProvider) { builder.RegisterInstance(logLevelSwitch); builder.RegisterInstance(appDataPathProvider); } }