VContainer-resolving/container-api | 解析——容器 API
1.VContainer 介绍2.VContainer-about/what-is-vcontainer | 概述——VContainer 是什么?3.VContainer-about/what-is-di | 概述——DI 是什么?4.VContainer-getting-started/installation | 入门——安装5.VContainer-getting-started/hello-world | 入门——Hello World6.VContainer-resolving/constructor-injection | 解析——构造函数注入7.VContainer-resolving/method-injection | 解析——方法注入8.VContainer-resolving/property-field-injection | 解析——属性/字段注入9.VContainer-resolving/gameobject-injection | 解析——注入到 MonoBehaviours 中
10.VContainer-resolving/container-api | 解析——容器 API
11.VContainer-registering/register-type | 注册——注册纯 C# 类型12.VContainer-registering/register-using-delegate | 注册——注册使用委托13.VContainer-registering/register-factory | 注册——注册工厂14.VContainer-registering/register-monobehaviour | 注册——注册 MonoBehaviour15.VContainer-registering/register-scriptable-object | 注册——注册 ScriptableObject16.VContainer-registering/register-collection | 注册——注册集合17.VContainer-registering/register-callbacks | 注册——注册回调18.VContainer-integrations/entrypoint | 集成——纯 C# 入口点19.VContainer-integrations/unitask | 集成——Unitask20.VContainer-integrations/unirx | 集成——UniRx21.VContainer-integrations/messagepipe | 集成——MessagePipe22.VContainer-integrations/ecs | 集成——ECS (beta)23.VContainer-scoping/lifetime-overview | 作用域——生命周期管理总览24.VContainer-scoping/generate-child-via-scene | 作用域——通过场景或 prefab 生成子作用域25.VContainer-scoping/generate-child-with-code-first | 作用域——通过代码优先生成子作用域26.VContainer-scoping/project-root-lifetimescope | 作用域——项目根作用域 LifetimeScope27.VContainer-diagnostics/diagnostics-window | 诊断——VContainer 诊断窗口28.VContainer-optimization/source-generator | 优化——源码生成器29.**VContainer-optimization/async-container-build | 优化——异步容器构建30.VContainer-optimization/parallel-container-build | 优化——并行容器构建31.VContainer-optimization/codegen | 优化——预生成 IL 代码(已弃用)32.VContainer-comparing/comparing-to-zenject | 对比 Zenject33.MessagePipe 中文文档通过 IObjectResolver
可以直接访问 DI 容器。VContainer 会自动注册 IObjectResolver
并将其注入到任何需要的地方,因此你可以通过依赖注入获取实例:
例如:
class ClassA
{
public ClassA(IObjectResolver container)
{
// 解析已注册的ServiceA实例。
// 如果将子类注册为 ServiceA,这可能是子类。
var serviceA = container.Resolve<ServiceA>();
// 对foo对象执行依赖注入。
// 重复注入同一个对象会覆盖已标记为 [Inject] 的属性或字段(或调用方法)。
container.Inject(foo);
// 注入到整个 GameObject 及其子物体的 MonoBehaviour 中,
// 无论目标 GameObject 和 MonoBehaviours 是否已启用。
container.InjectGameObject(gameObject);
// 实例化预制体并自动注入依赖,
// 依赖项将注入其 MonoBehaviours(及其子对象的 MonoBehaviours)中。
// 通过其他方式创建 GameObject(例如程序化生成或从 Addressables 加载),请考虑使用 InjectGameObject。
var object1 = container.Instantiate(prefab);
// 支持多种实例化重载
var object2 = container.Instantiate(prefab, parent);
var object3 = container.Instantiate(prefab, position, rotation, parent);
}
}
如果经常以某种模式使用 IObjectResolver.Inject
,建议封装为扩展方法。事实上,几乎每个 IObjectResolver
API 都是一个扩展方法(包括前面的代码示例)。
:::tip
建议优先使用自动注入而非显式调用 Resolve
。只有在其他支持的注入技术不符合你的需求时,或者在使用暴露了 IObjectResolver
的 VContainer 回调时(例如 构建回调 或 某些工厂函数),你才需要显式使用 IObjectResolver.Resolve
。所有解析技术在性能上相似(如果你使用了 IL 生成器),但直接使用 Resolve
需要编写更多代码并且会模糊你的意图。
:::
LifetimeScope
通过其 Container
属性引用 IObjectResolver
。VContainer 也会自动注册它,但在容器构建后通常不再需要它。通过 LifetimeScope
的 Container 属性也可访问解析器:
class ClassA
{
public ClassA(LifetimeScope currentScope)
{
// 如果需要,也可以注入 LifetimeScope,
// 但在这种情况下自动注入 ServiceA 足矣。
var foo = currentScope.Container.Resolve<ServiceA>();
}
}
合集:
VContainer 中文文档
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!