using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using VContainer.Internal; namespace VContainer { public static class ContainerBuilderExtensions { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder Register( this IContainerBuilder builder, Type type, Lifetime lifetime) => builder.Register(type.IsGenericType && type.IsGenericTypeDefinition ? new OpenGenericRegistrationBuilder(type, lifetime) : new RegistrationBuilder(type, lifetime)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder Register( this IContainerBuilder builder, Type interfaceType, Type implementationType, Lifetime lifetime) => builder.Register(implementationType, lifetime).As(interfaceType); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder Register( this IContainerBuilder builder, Lifetime lifetime) => builder.Register(typeof(T), lifetime); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder Register( this IContainerBuilder builder, Lifetime lifetime) where TImplement : TInterface => builder.Register(lifetime).As(); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder Register( this IContainerBuilder builder, Lifetime lifetime) where TImplement : TInterface1, TInterface2 => builder.Register(lifetime).As(typeof(TInterface1), typeof(TInterface2)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder Register( this IContainerBuilder builder, Lifetime lifetime) where TImplement : TInterface1, TInterface2, TInterface3 => builder.Register(lifetime).As(typeof(TInterface1), typeof(TInterface2), typeof(TInterface3)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder Register( this IContainerBuilder builder, Func implementationConfiguration, Lifetime lifetime) => builder.Register(new FuncRegistrationBuilder(container => implementationConfiguration(container), typeof(TInterface), lifetime)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder RegisterInstance( this IContainerBuilder builder, object instance, Type implementationType) => builder.Register(new InstanceRegistrationBuilder(instance)).As(implementationType); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder RegisterInstance( this IContainerBuilder builder, TInterface instance) => builder.Register(new InstanceRegistrationBuilder(instance)).As(typeof(TInterface)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder RegisterInstance( this IContainerBuilder builder, TInterface1 instance) => builder.RegisterInstance(instance).As(typeof(TInterface1), typeof(TInterface2)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder RegisterInstance( this IContainerBuilder builder, TInterface1 instance) => builder.RegisterInstance(instance).As(typeof(TInterface1), typeof(TInterface2), typeof(TInterface3)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder RegisterFactory( this IContainerBuilder builder, Func factory) => builder.RegisterInstance(factory); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder RegisterFactory( this IContainerBuilder builder, Func factory) => builder.RegisterInstance(factory); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder RegisterFactory( this IContainerBuilder builder, Func factory) => builder.RegisterInstance(factory); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder RegisterFactory( this IContainerBuilder builder, Func factory) => builder.RegisterInstance(factory); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder RegisterFactory( this IContainerBuilder builder, Func factory) => builder.RegisterInstance(factory); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder RegisterFactory( this IContainerBuilder builder, Func> factoryFactory, Lifetime lifetime) => builder.Register(new FuncRegistrationBuilder(factoryFactory, typeof(Func), lifetime)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder RegisterFactory( this IContainerBuilder builder, Func> factoryFactory, Lifetime lifetime) => builder.Register(new FuncRegistrationBuilder(factoryFactory, typeof(Func), lifetime)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder RegisterFactory( this IContainerBuilder builder, Func> factoryFactory, Lifetime lifetime) => builder.Register(new FuncRegistrationBuilder(factoryFactory, typeof(Func), lifetime)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder RegisterFactory( this IContainerBuilder builder, Func> factoryFactory, Lifetime lifetime) => builder.Register(new FuncRegistrationBuilder(factoryFactory, typeof(Func), lifetime)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RegistrationBuilder RegisterFactory( this IContainerBuilder builder, Func> factoryFactory, Lifetime lifetime) => builder.Register(new FuncRegistrationBuilder(factoryFactory, typeof(Func), lifetime)); public static void RegisterDisposeCallback(this IContainerBuilder builder, Action callback) { if (!builder.Exists(typeof(BuilderCallbackDisposable))) { builder.Register(Lifetime.Singleton); } builder.RegisterBuildCallback(container => { var disposable = container.Resolve(); disposable.Disposing += callback; }); } [Obsolete("IObjectResolver is registered by default. This method does nothing.")] public static void RegisterContainer(this IContainerBuilder builder) { } } }