#if !NOT_UNITY3D using ModestTree; namespace Zenject { // We'd prefer to make this abstract but Unity 5.3.5 has a bug where references // can get lost during compile errors for classes that are abstract public class MonoInstaller : MonoInstallerBase { } // // Derive from this class instead to install like this: // FooInstaller.InstallFromResource(Container); // Or // FooInstaller.InstallFromResource("My/Path/ToPrefab", Container); // // (Instead of needing to add the MonoInstaller via inspector) // // This approach is needed if you want to pass in strongly parameters to it from // another installer public class MonoInstaller : MonoInstaller where TDerived : MonoInstaller { public static TDerived InstallFromResource(DiContainer container) { return InstallFromResource(MonoInstallerUtil.GetDefaultResourcePath(), container); } public static TDerived InstallFromResource(string resourcePath, DiContainer container) { return InstallFromResource(resourcePath, container, new object[0]); } public static TDerived InstallFromResource(DiContainer container, object[] extraArgs) { return InstallFromResource(MonoInstallerUtil.GetDefaultResourcePath(), container, extraArgs); } public static TDerived InstallFromResource(string resourcePath, DiContainer container, object[] extraArgs) { var installer = MonoInstallerUtil.CreateInstaller(resourcePath, container); container.Inject(installer, extraArgs); installer.InstallBindings(); return installer; } } public class MonoInstaller : MonoInstallerBase where TDerived : MonoInstaller { public static TDerived InstallFromResource(DiContainer container, TParam1 p1) { return InstallFromResource(MonoInstallerUtil.GetDefaultResourcePath(), container, p1); } public static TDerived InstallFromResource(string resourcePath, DiContainer container, TParam1 p1) { var installer = MonoInstallerUtil.CreateInstaller(resourcePath, container); container.InjectExplicit(installer, InjectUtil.CreateArgListExplicit(p1)); installer.InstallBindings(); return installer; } } public class MonoInstaller : MonoInstallerBase where TDerived : MonoInstaller { public static TDerived InstallFromResource(DiContainer container, TParam1 p1, TParam2 p2) { return InstallFromResource(MonoInstallerUtil.GetDefaultResourcePath(), container, p1, p2); } public static TDerived InstallFromResource(string resourcePath, DiContainer container, TParam1 p1, TParam2 p2) { var installer = MonoInstallerUtil.CreateInstaller(resourcePath, container); container.InjectExplicit(installer, InjectUtil.CreateArgListExplicit(p1, p2)); installer.InstallBindings(); return installer; } } public class MonoInstaller : MonoInstallerBase where TDerived : MonoInstaller { public static TDerived InstallFromResource(DiContainer container, TParam1 p1, TParam2 p2, TParam3 p3) { return InstallFromResource(MonoInstallerUtil.GetDefaultResourcePath(), container, p1, p2, p3); } public static TDerived InstallFromResource(string resourcePath, DiContainer container, TParam1 p1, TParam2 p2, TParam3 p3) { var installer = MonoInstallerUtil.CreateInstaller(resourcePath, container); container.InjectExplicit(installer, InjectUtil.CreateArgListExplicit(p1, p2, p3)); installer.InstallBindings(); return installer; } } public class MonoInstaller : MonoInstallerBase where TDerived : MonoInstaller { public static TDerived InstallFromResource(DiContainer container, TParam1 p1, TParam2 p2, TParam3 p3, TParam4 p4) { return InstallFromResource(MonoInstallerUtil.GetDefaultResourcePath(), container, p1, p2, p3, p4); } public static TDerived InstallFromResource(string resourcePath, DiContainer container, TParam1 p1, TParam2 p2, TParam3 p3, TParam4 p4) { var installer = MonoInstallerUtil.CreateInstaller(resourcePath, container); container.InjectExplicit(installer, InjectUtil.CreateArgListExplicit(p1, p2, p3, p4)); installer.InstallBindings(); return installer; } } public class MonoInstaller : MonoInstallerBase where TDerived : MonoInstaller { public static TDerived InstallFromResource(DiContainer container, TParam1 p1, TParam2 p2, TParam3 p3, TParam4 p4, TParam5 p5) { return InstallFromResource(MonoInstallerUtil.GetDefaultResourcePath(), container, p1, p2, p3, p4, p5); } public static TDerived InstallFromResource(string resourcePath, DiContainer container, TParam1 p1, TParam2 p2, TParam3 p3, TParam4 p4, TParam5 p5) { var installer = MonoInstallerUtil.CreateInstaller(resourcePath, container); container.InjectExplicit(installer, InjectUtil.CreateArgListExplicit(p1, p2, p3, p4, p5)); installer.InstallBindings(); return installer; } } public static class MonoInstallerUtil { public static string GetDefaultResourcePath() where TInstaller : MonoInstallerBase { return "Installers/" + typeof(TInstaller).PrettyName(); } public static TInstaller CreateInstaller( string resourcePath, DiContainer container) where TInstaller : MonoInstallerBase { bool shouldMakeActive; var gameObj = container.CreateAndParentPrefabResource( resourcePath, GameObjectCreationParameters.Default, null, out shouldMakeActive); if (shouldMakeActive && !container.IsValidating) { #if ZEN_INTERNAL_PROFILING using (ProfileTimers.CreateTimedBlock("User Code")) #endif { gameObj.SetActive(true); } } var installers = gameObj.GetComponentsInChildren(); Assert.That(installers.Length == 1, "Could not find unique MonoInstaller with type '{0}' on prefab '{1}'", typeof(TInstaller), gameObj.name); return installers[0]; } } } #endif