45 lines
1.5 KiB
C#
Executable File
45 lines
1.5 KiB
C#
Executable File
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<Component>() : gameObject.GetComponents<Component>();
|
|
foreach (Component component in components) {
|
|
context.Inject(component);
|
|
}
|
|
}
|
|
}
|
|
} |