VContainer-resolving/container-api | 解析——容器 API

通过 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>();
    }
}
posted @   凌雪寒  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示