using System.Reflection; using Autofac; using Autofac.Extras.Ordering; using AutoMapper.Contrib.Autofac.DependencyInjection; using AutoMapper.EquivalencyExpression; using Recyclarr.Common; using Recyclarr.Common.FluentValidation; using Recyclarr.TrashLib.ApiServices; using Recyclarr.TrashLib.Compatibility; using Recyclarr.TrashLib.Config; using Recyclarr.TrashLib.Http; using Recyclarr.TrashLib.Repo; using Recyclarr.TrashLib.Repo.VersionControl; using Recyclarr.TrashLib.Startup; using Module = Autofac.Module; namespace Recyclarr.TrashLib; public class TrashLibAutofacModule : Module { public Assembly? AdditionalMapperProfileAssembly { get; init; } protected override void Load(ContainerBuilder builder) { base.Load(builder); RegisterAppPaths(builder); CommonRegistrations(builder); // Needed for Autofac.Extras.Ordering builder.RegisterSource(); builder.RegisterModule(); builder.RegisterModule(); builder.RegisterModule(); builder.RegisterModule(); builder.RegisterModule(); builder.RegisterType().As(); builder.RegisterType().As().SingleInstance(); var mapperAssemblies = new List {ThisAssembly}; if (AdditionalMapperProfileAssembly is not null) { mapperAssemblies.Add(AdditionalMapperProfileAssembly); } builder.RegisterAutoMapper(c => c.AddCollectionMappers(), false, mapperAssemblies.ToArray()); } private static void CommonRegistrations(ContainerBuilder builder) { builder.RegisterType().As(); builder.RegisterType().As(); } private static void RegisterAppPaths(ContainerBuilder builder) { builder.RegisterType(); builder.Register(c => { var appData = c.Resolve(); var dataSetup = c.Resolve(); return dataSetup.CreateAppPaths(appData.AppDataPath); }) .As() .SingleInstance(); } }