Files
dungeons/Assets/Plugins/Zenject/Source/Util/ZenAutoInjecter.cs

74 lines
2.0 KiB
C#

using ModestTree;
using UnityEngine;
namespace Zenject
{
public class ZenAutoInjecter : MonoBehaviour
{
[SerializeField]
ContainerSources _containerSource = ContainerSources.SearchHierarchy;
bool _hasInjected;
public ContainerSources ContainerSource
{
get { return _containerSource; }
set { _containerSource = value; }
}
// Make sure they don't cause injection to happen twice
[Inject]
public void Construct()
{
if (!_hasInjected)
{
throw Assert.CreateException(
"ZenAutoInjecter was injected! Do not use ZenAutoInjecter for objects that are instantiated through zenject or which exist in the initial scene hierarchy");
}
}
public void Awake()
{
_hasInjected = true;
LookupContainer().InjectGameObject(gameObject);
}
DiContainer LookupContainer()
{
if (_containerSource == ContainerSources.ProjectContext)
{
return ProjectContext.Instance.Container;
}
if (_containerSource == ContainerSources.SceneContext)
{
return GetContainerForCurrentScene();
}
Assert.IsEqual(_containerSource, ContainerSources.SearchHierarchy);
var parentContext = transform.GetComponentInParent<Context>();
if (parentContext != null)
{
return parentContext.Container;
}
return GetContainerForCurrentScene();
}
DiContainer GetContainerForCurrentScene()
{
return ProjectContext.Instance.Container.Resolve<SceneContextRegistry>()
.GetContainerForScene(gameObject.scene);
}
public enum ContainerSources
{
SceneContext,
ProjectContext,
SearchHierarchy
}
}
}