Injecting into MonoBehaviours
As MonoBehaviours do not support constructors, you must use method injection to inject them with dependencies.
Note that the presence of the [Inject] attribute on a MonoBehaviour's method does not imply that it will automatically be called. You must inject dependencies manually in one of the following three ways:
- If you want to inject into a specific
MonoBehaviour, you can specify it in theLifetimeScope's inspector.- The
MonoBehaviours of all specifiedGameObject(and their children) will be automaticallyInjected when theLifetimeScopeis initialized.
- The
- Use one of the
RegisterComponent*methods to register theMonoBehaviourinstance to the container.- In this case, the registered
MonoBehaviourwill bothInjectand beInjected into other classes. - See Register MonoBehaviour
- In this case, the registered
- To inject into dynamically-generated
MonoBehaviours at runtime (e.g. from prefabs), useIObjectResolver.Instantiateinstead ofUnityEngine.Object.Instantiate. (Factory patterns and object generation expressions can be registered.)
Why doesn't VContainer automatically inject into all MonoBehaviours?#
- Unity doesn't provide a good way to listen for the creation of all
GameObjects orMonoBehaviours. Rather than having some cases that are automaticallyInjected and some that are not, we decided on explicitInjection that you can use to fit your own needs. - We do not recommend excecuting
Injectdirectly onMonoBehaviours; instead, useInjectGameObjecton the owningGameObject.- This is because the purpose of VContainer and DI is inversion of control of MonoBehaviour.
- If a
MonoBehaviourneeds an explicitInjectcall, you risk losing the advantages of Unity's prefab portability.