VContainer-resolving/gameobject-injection | 解析——注入到 MonoBehaviours 中
由于 Unity 的 MonoBehaviours 不支持构造函数,必须使用 方法注入 来注入依赖项。
注意:即使 MonoBehaviour 的方法带有 [Inject] 特性标记,也不会自动触发注入。必须通过以下三种方式之一手动注入依赖:
- 如果想注入到特定的
MonoBehaviour,可以在LifetimeScope的检查器(Inspector)中进行指定。- 所有指定
GameObject(及其子对象)的MonoBehaviours 将在LifetimeScope初始化时自动Inject。
- 所有指定
- 使用
RegisterComponent*系列方法将MonoBehaviour实例注册到容器中。- 在这种情况下,注册的
MonoBehaviour将同时Inject和被Inject到其他类中。 - 参见 注册 MonoBehaviour
- 在这种情况下,注册的
- 要在运行时注入到动态生成的
MonoBehaviours 中(例如预制体的生成),应使用IObjectResolver.Instantiate代替UnityEngine.Object.Instantiate。(可以注册工厂模式和对象生成表达式。)
为什么 VContainer 不自动注入到所有 MonoBehaviours 中?
- Unity 没有提供监听所有
GameObjects 或MonoBehaviours 创建的机制。与其有一些情况自动Inject而另一些情况不自动Inject,我们采用显式Inject以满足不同需求。 - 推荐在 GameObject 层级调用
InjectGameObject;不建议直接在MonoBehaviours 上执行Inject。原因如下:MonoBehaviour是一个 C# 类,允许你为任何东西编写代码,而且它在运行时动态创建/销毁。注入到具有动态生命周期的对象会使引用管理复杂化。最简单的解决方案是不这样做。- VContainer 和 DI 的目的是反转 MonoBehaviour 的控制。
- 视图组件通常是检测事件和发生的起点,但它也可以通知外部世界它拥有检测到的事件。
- 如果
MonoBehaviour需要显式的Inject调用,可能会失去 Unity 预制件的可移植性优势。 - 为了让视图组件正常工作,它需要知道要在屏幕上显示的数据/状态,但运行时频繁变化的数据应通过参数传递而非依赖注入
Inject。

浙公网安备 33010602011771号