using System; using System.Collections.Generic; using ModestTree; namespace Zenject { // Zero parameters [NoReflectionBaking] public abstract class SubContainerCreatorByMethodBase : ISubContainerCreator { readonly DiContainer _container; readonly SubContainerCreatorBindInfo _containerBindInfo; public SubContainerCreatorByMethodBase( DiContainer container, SubContainerCreatorBindInfo containerBindInfo) { _container = container; _containerBindInfo = containerBindInfo; } public abstract DiContainer CreateSubContainer( List args, InjectContext context, out Action injectAction); protected DiContainer CreateEmptySubContainer() { var subContainer = _container.CreateSubContainer(); SubContainerCreatorUtil.ApplyBindSettings(_containerBindInfo, subContainer); return subContainer; } } [NoReflectionBaking] public class SubContainerCreatorByMethod : SubContainerCreatorByMethodBase { readonly Action _installMethod; public SubContainerCreatorByMethod( DiContainer container, SubContainerCreatorBindInfo containerBindInfo, Action installMethod) : base(container, containerBindInfo) { _installMethod = installMethod; } public override DiContainer CreateSubContainer(List args, InjectContext context, out Action injectAction) { Assert.IsEmpty(args); var subContainer = CreateEmptySubContainer(); _installMethod(subContainer); injectAction = () => { subContainer.ResolveRoots(); }; return subContainer; } } // One parameters [NoReflectionBaking] public class SubContainerCreatorByMethod : SubContainerCreatorByMethodBase { readonly Action _installMethod; public SubContainerCreatorByMethod( DiContainer container, SubContainerCreatorBindInfo containerBindInfo, Action installMethod) : base(container, containerBindInfo) { _installMethod = installMethod; } public override DiContainer CreateSubContainer(List args, InjectContext context, out Action injectAction) { Assert.IsEqual(args.Count, 1); Assert.That(args[0].Type.DerivesFromOrEqual()); var subContainer = CreateEmptySubContainer(); _installMethod(subContainer, (TParam1)args[0].Value); injectAction = () => { subContainer.ResolveRoots(); }; return subContainer; } } // Two parameters [NoReflectionBaking] public class SubContainerCreatorByMethod : SubContainerCreatorByMethodBase { readonly Action _installMethod; public SubContainerCreatorByMethod( DiContainer container, SubContainerCreatorBindInfo containerBindInfo, Action installMethod) : base(container, containerBindInfo) { _installMethod = installMethod; } public override DiContainer CreateSubContainer(List args, InjectContext context, out Action injectAction) { Assert.IsEqual(args.Count, 2); Assert.That(args[0].Type.DerivesFromOrEqual()); Assert.That(args[1].Type.DerivesFromOrEqual()); var subContainer = CreateEmptySubContainer(); _installMethod( subContainer, (TParam1)args[0].Value, (TParam2)args[1].Value); injectAction = () => { subContainer.ResolveRoots(); }; return subContainer; } } // Three parameters [NoReflectionBaking] public class SubContainerCreatorByMethod : SubContainerCreatorByMethodBase { readonly Action _installMethod; public SubContainerCreatorByMethod( DiContainer container, SubContainerCreatorBindInfo containerBindInfo, Action installMethod) : base(container, containerBindInfo) { _installMethod = installMethod; } public override DiContainer CreateSubContainer(List args, InjectContext context, out Action injectAction) { Assert.IsEqual(args.Count, 3); Assert.That(args[0].Type.DerivesFromOrEqual()); Assert.That(args[1].Type.DerivesFromOrEqual()); Assert.That(args[2].Type.DerivesFromOrEqual()); var subContainer = CreateEmptySubContainer(); _installMethod( subContainer, (TParam1)args[0].Value, (TParam2)args[1].Value, (TParam3)args[2].Value); injectAction = () => { subContainer.ResolveRoots(); }; return subContainer; } } // Four parameters [NoReflectionBaking] public class SubContainerCreatorByMethod : SubContainerCreatorByMethodBase { readonly #if !NET_4_6 ModestTree.Util. #endif Action _installMethod; public SubContainerCreatorByMethod( DiContainer container, SubContainerCreatorBindInfo containerBindInfo, #if !NET_4_6 ModestTree.Util. #endif Action installMethod) : base(container, containerBindInfo) { _installMethod = installMethod; } public override DiContainer CreateSubContainer(List args, InjectContext context, out Action injectAction) { Assert.IsEqual(args.Count, 4); Assert.That(args[0].Type.DerivesFromOrEqual()); Assert.That(args[1].Type.DerivesFromOrEqual()); Assert.That(args[2].Type.DerivesFromOrEqual()); Assert.That(args[3].Type.DerivesFromOrEqual()); var subContainer = CreateEmptySubContainer(); _installMethod( subContainer, (TParam1)args[0].Value, (TParam2)args[1].Value, (TParam3)args[2].Value, (TParam4)args[3].Value); injectAction = () => { subContainer.ResolveRoots(); }; return subContainer; } } // Five parameters [NoReflectionBaking] public class SubContainerCreatorByMethod : SubContainerCreatorByMethodBase { readonly #if !NET_4_6 ModestTree.Util. #endif Action _installMethod; public SubContainerCreatorByMethod( DiContainer container, SubContainerCreatorBindInfo containerBindInfo, #if !NET_4_6 ModestTree.Util. #endif Action installMethod) : base(container, containerBindInfo) { _installMethod = installMethod; } public override DiContainer CreateSubContainer(List args, InjectContext context, out Action injectAction) { Assert.IsEqual(args.Count, 5); Assert.That(args[0].Type.DerivesFromOrEqual()); Assert.That(args[1].Type.DerivesFromOrEqual()); Assert.That(args[2].Type.DerivesFromOrEqual()); Assert.That(args[3].Type.DerivesFromOrEqual()); Assert.That(args[4].Type.DerivesFromOrEqual()); var subContainer = CreateEmptySubContainer(); _installMethod( subContainer, (TParam1)args[0].Value, (TParam2)args[1].Value, (TParam3)args[2].Value, (TParam4)args[3].Value, (TParam5)args[4].Value); injectAction = () => { subContainer.ResolveRoots(); }; return subContainer; } } // Six parameters [NoReflectionBaking] public class SubContainerCreatorByMethod : SubContainerCreatorByMethodBase { readonly #if !NET_4_6 ModestTree.Util. #endif Action _installMethod; public SubContainerCreatorByMethod( DiContainer container, SubContainerCreatorBindInfo containerBindInfo, #if !NET_4_6 ModestTree.Util. #endif Action installMethod) : base(container, containerBindInfo) { _installMethod = installMethod; } public override DiContainer CreateSubContainer(List args, InjectContext context, out Action injectAction) { Assert.IsEqual(args.Count, 5); Assert.That(args[0].Type.DerivesFromOrEqual()); Assert.That(args[1].Type.DerivesFromOrEqual()); Assert.That(args[2].Type.DerivesFromOrEqual()); Assert.That(args[3].Type.DerivesFromOrEqual()); Assert.That(args[4].Type.DerivesFromOrEqual()); Assert.That(args[5].Type.DerivesFromOrEqual()); var subContainer = CreateEmptySubContainer(); _installMethod( subContainer, (TParam1)args[0].Value, (TParam2)args[1].Value, (TParam3)args[2].Value, (TParam4)args[3].Value, (TParam5)args[4].Value, (TParam6)args[5].Value); injectAction = () => { subContainer.ResolveRoots(); }; return subContainer; } } // 10 parameters [NoReflectionBaking] public class SubContainerCreatorByMethod : SubContainerCreatorByMethodBase { readonly #if !NET_4_6 ModestTree.Util. #endif Action _installMethod; public SubContainerCreatorByMethod( DiContainer container, SubContainerCreatorBindInfo containerBindInfo, #if !NET_4_6 ModestTree.Util. #endif Action installMethod) : base(container, containerBindInfo) { _installMethod = installMethod; } public override DiContainer CreateSubContainer(List args, InjectContext context, out Action injectAction) { Assert.IsEqual(args.Count, 10); Assert.That(args[0].Type.DerivesFromOrEqual()); Assert.That(args[1].Type.DerivesFromOrEqual()); Assert.That(args[2].Type.DerivesFromOrEqual()); Assert.That(args[3].Type.DerivesFromOrEqual()); Assert.That(args[4].Type.DerivesFromOrEqual()); Assert.That(args[5].Type.DerivesFromOrEqual()); Assert.That(args[6].Type.DerivesFromOrEqual()); Assert.That(args[7].Type.DerivesFromOrEqual()); Assert.That(args[8].Type.DerivesFromOrEqual()); Assert.That(args[9].Type.DerivesFromOrEqual()); var subContainer = CreateEmptySubContainer(); _installMethod( subContainer, (TParam1)args[0].Value, (TParam2)args[1].Value, (TParam3)args[2].Value, (TParam4)args[3].Value, (TParam5)args[4].Value, (TParam6)args[5].Value, (TParam7)args[6].Value, (TParam8)args[7].Value, (TParam9)args[8].Value, (TParam10)args[9].Value); injectAction = () => { subContainer.ResolveRoots(); }; return subContainer; } } }