using Autofac; using Autofac.Core; using MAX.Core.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; namespace Store.Framework.DependencyInjection; internal class ServiceRegistrarProxy : IServiceRegistrar { private readonly ContainerBuilder _services; public object Services => _services; public ServiceRegistrarProxy(ContainerBuilder builder) { _services = builder ?? throw new ArgumentNullException(nameof(builder)); } // ---------------- Scoped ---------------- public void RegisterScoped(Func factory) where TService : class { _services.Register(c => factory(c.Resolve())) .As() .InstancePerLifetimeScope(); } public void RegisterScoped(object? serviceKey, Func factory) where TService : class { _services.Register(c => factory(c.Resolve(), serviceKey)) .Keyed(serviceKey ?? throw new ArgumentNullException(nameof(serviceKey))) .InstancePerLifetimeScope(); } void IServiceRegistrar.RegisterScoped() { _services.RegisterType() .As() .InstancePerLifetimeScope(); } void IServiceRegistrar.RegisterScoped(object? serviceKey) { _services.RegisterType() .Keyed(serviceKey ?? throw new ArgumentNullException(nameof(serviceKey))) .InstancePerLifetimeScope(); } // ---------------- Singleton ---------------- public void RegisterSingleton(TService instance) where TService : class { _services.RegisterInstance(instance) .As() .SingleInstance(); } public void RegisterSingleton(Func factory) where TService : class { _services.Register(c => factory(c.Resolve())) .As() .SingleInstance(); } public void RegisterSingleton(object? serviceKey, TService instance) where TService : class { _services.RegisterInstance(instance) .Keyed(serviceKey ?? throw new ArgumentNullException(nameof(serviceKey))) .SingleInstance(); } public void RegisterSingleton(object? serviceKey, Func factory) where TService : class { _services.Register(c => factory(c.Resolve(), serviceKey)) .Keyed(serviceKey ?? throw new ArgumentNullException(nameof(serviceKey))) .SingleInstance(); } void IServiceRegistrar.RegisterSingleton() { _services.RegisterType() .As() .SingleInstance(); } void IServiceRegistrar.RegisterSingleton(object? serviceKey) { _services.RegisterType() .Keyed(serviceKey ?? throw new ArgumentNullException(nameof(serviceKey))) .SingleInstance(); } // ---------------- Transient ---------------- public void RegisterTransient(Func factory) where TService : class { _services.Register(c => factory(c.Resolve())) .As() .InstancePerDependency(); } public void RegisterTransient(object? serviceKey, Func factory) where TService : class { _services.Register(c => factory(c.Resolve(), serviceKey)) .Keyed(serviceKey ?? throw new ArgumentNullException(nameof(serviceKey))) .InstancePerDependency(); } void IServiceRegistrar.RegisterTransient() { _services.RegisterType() .As() .InstancePerDependency(); } void IServiceRegistrar.RegisterTransient(object? serviceKey) { _services.RegisterType() .Keyed(serviceKey ?? throw new ArgumentNullException(nameof(serviceKey))) .InstancePerDependency(); } }