using Unity.Assertions; using UnityEngine; 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 SceneDI : MonoBehaviour, IDependencyInstaller { static readonly Logger s_logger = new(nameof(SceneDI)); [SerializeField] SceneDependencyInstaller[] m_Installers; void Awake() { DIContext context = RR.DIContext; foreach (GameObject root in gameObject.scene.GetRootGameObjects()) { context.InjectGameObject(root); } } public void Install(DIContext context) { foreach (SceneDependencyInstaller installer in m_Installers) { installer.Install(context); } } } 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); } } } }