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.MonoBehaviouris a C# class that allows you to write code for anything, also, it is dynamically created/destroyed at runtime. Injection into an object with a dynamic lifetime complicates reference management. The simplest solution to this is to not do it.- This is because the purpose of VContainer and DI is inversion of control of MonoBehaviour.
- View component is often the starting point for detecting events and happenings, but it can also be styled to notify the outside world that it has ownership of the events it detects.
- If a
MonoBehaviourneeds an explicitInjectcall, you risk losing the advantages of Unity's prefab portability. - Of course, in order for the View component to work, it needs to know the data/state to be displayed on the screen, but data that changes rapidly at runtime is not subject to injection by
[Inject], and is better handled as mere "values" by arguments.