using System.IO.Abstractions; using System.Reflection; using Autofac; using Autofac.Extras.Ordering; using AutoMapper.Contrib.Autofac.DependencyInjection; using Recyclarr.Cli.Console.Helpers; using Recyclarr.Cli.Console.Setup; using Recyclarr.Cli.Logging; using Recyclarr.Cli.Migration; using Recyclarr.Common; using Recyclarr.Common.Extensions; using Recyclarr.TrashLib.Cache; using Recyclarr.TrashLib.Config; using Recyclarr.TrashLib.Http; using Recyclarr.TrashLib.Repo; using Recyclarr.TrashLib.Repo.VersionControl; using Recyclarr.TrashLib.Services.Common; using Recyclarr.TrashLib.Services.CustomFormat; using Recyclarr.TrashLib.Services.Processors; using Recyclarr.TrashLib.Services.Radarr; using Recyclarr.TrashLib.Services.Sonarr; using Recyclarr.TrashLib.Services.System; using Recyclarr.TrashLib.Startup; using Serilog; using Spectre.Console.Cli; namespace Recyclarr.Cli; public static class CompositionRoot { public static void Setup(ContainerBuilder builder) { var assemblies = AppDomain.CurrentDomain.GetAssemblies() .Where(x => x.FullName?.StartsWithIgnoreCase("Recyclarr") ?? false) .ToArray(); RegisterAppPaths(builder); RegisterLogger(builder); builder.RegisterModule(); builder.RegisterModule(); builder.RegisterModule(); builder.RegisterModule(); builder.RegisterModule(); builder.RegisterModule(); builder.RegisterModule(); builder.RegisterModule(); builder.RegisterModule(new ConfigAutofacModule(assemblies)); builder.RegisterModule(); builder.RegisterModule(new CommonAutofacModule(Assembly.GetExecutingAssembly())); // Needed for Autofac.Extras.Ordering builder.RegisterSource(); builder.RegisterModule(); builder.RegisterType().As(); builder.RegisterType().As(); CommandRegistrations(builder); builder.RegisterAutoMapper(false, assemblies); builder.RegisterType().As().SingleInstance(); } private static void RegisterLogger(ContainerBuilder builder) { builder.RegisterType().As(); builder.RegisterType(); builder.Register(c => c.Resolve().Create()).As().SingleInstance(); } private static void RegisterAppPaths(ContainerBuilder builder) { builder.RegisterType().As(); builder.RegisterType(); builder.Register(c => { var appData = c.Resolve(); var dataSetup = c.Resolve(); return dataSetup.CreateAppPaths(appData.AppDataPath); }) .As() .SingleInstance(); } private static void CommandRegistrations(ContainerBuilder builder) { builder.RegisterTypes( typeof(AppPathSetupTask), typeof(JanitorCleanupTask)) .As() .OrderByRegistration(); builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()) .AssignableTo(); } }