如何使用VContainer跨程序集定义实现依赖注入?
跨程序集LifetimeScope依赖访问配置方案
问题根源
同级的SimulationLifetimeScope和PresentationLifetimeScope默认维护独立的依赖容器,彼此隔离,因此表现层容器无法识别模拟层容器中注册的PlayerController类型。
可行配置方案
方案1:设置父子作用域关联
在Unity编辑器中,选中PresentationLifetimeScope物体,在Inspector面板的Parent Scope字段中,将SimulationLifetimeScope实例拖入。这样表现层的依赖容器会继承模拟层容器的所有注册项,表现层脚本就能正常注入PlayerController。
方案2:手动合并容器注册(保持同级结构)
如果需要维持两个LifetimeScope的同级关系,可在PresentationLifetimeScope代码中手动合并模拟层容器的注册:
public class PresentationLifetimeScope : LifetimeScope { public SimulationLifetimeScope simulationScope; protected override void Configure() { // 将模拟层容器的注册内容合并到当前容器 Container.InjectFrom(simulationScope.Container); } }
完成代码编写后,在Inspector面板将SimulationLifetimeScope实例拖入simulationScope字段即可。
方案3:设置全局共享作用域(多模块共享场景)
若项目中有多个模块需要访问模拟层依赖,可将SimulationLifetimeScope设为全局作用域:
- 勾选
SimulationLifetimeScopeInspector面板中的Is Global选项 - 此后所有其他
LifetimeScope都会自动识别全局容器中的注册类型,无需额外配置依赖
注意事项
- 确保
SimulationLifetimeScope的初始化优先于PresentationLifetimeScope:可通过调整Hierarchy面板中物体的上下顺序(Unity按Hierarchy顺序执行同级物体的Awake),或在表现层作用域中添加延迟初始化逻辑。 - 模拟层的
PlayerController需设为公开访问级别(public),保证表现层程序集能正常访问该类型。
内容的提问来源于stack exchange,提问作者Tycho 9000
相关产品推荐
相关产品推荐

