using UnityEngine; using UnityEngine.Assertions; namespace RebootKit.Engine.Foundation { public interface IDependencyInstaller { void Install(DIContext context); } public abstract class SceneDependencyInstaller : MonoBehaviour, IDependencyInstaller { public abstract void Install(DIContext context); } [DefaultExecutionOrder(-1000)] public class SceneContext : MonoBehaviour { static readonly Logger s_logger = new Logger(nameof(SceneContext)); [SerializeField] SceneDependencyInstaller[] m_Installers; DIContext m_DIContext; void Awake() { m_DIContext = new DIContext(); s_logger.Info("Installing scene dependency installers"); foreach (SceneDependencyInstaller installer in m_Installers) { installer.Install(m_DIContext); } foreach (GameObject root in gameObject.scene.GetRootGameObjects()) { m_DIContext.InjectGameObject(root); } } } public static class DIContextGameObjectEx { public static void InjectGameObject(this DIContext context, GameObject gameObject, bool injectChildren = true) { Assert.IsNotNull(gameObject); Component[] components = injectChildren ? gameObject.GetComponentsInChildren() : gameObject.GetComponents(); foreach (Component component in components) { context.Inject(component); } } } }