Unity Zenject中抽象类ShipState实现IInitializable无效的原因
问题解答
一、为什么Dispose()能正常执行?
Zenject对实现了IDisposable接口的对象有内置生命周期管理机制:
- 通过Zenject工厂创建对象时,容器会自动跟踪这些实例。
- 当容器销毁(比如场景卸载)或实例被Zenject内存管理系统回收时,会自动调用
Dispose()方法,不需要显式添加BindInterfaces()或其他绑定配置,这是Zenject为简化资源清理设计的默认行为。
二、为什么Initialize()没被调用?
IInitializable接口的Initialize()方法不会像IDisposable那样自动触发,原因如下:
IInitializable默认仅对容器直接实例化的对象(比如Bind<>.AsSingle()绑定的单例)生效,容器启动时会自动调用这些对象的Initialize()。- 通过工厂创建的对象,Zenject不会自动执行
Initialize(),需要在工厂绑定阶段显式配置,修改InstallShip()中的工厂绑定代码,添加WithInitializable():
Container.BindFactory<ShipStateWaitingToStart, ShipStateWaitingToStart.Factory>() .WhenInjectedInto<ShipStateFactory>() .WithInitializable(); Container.BindFactory<ShipStateDead, ShipStateDead.Factory>() .WhenInjectedInto<ShipStateFactory>() .WithInitializable(); Container.BindFactory<ShipStateMoving, ShipStateMoving.Factory>() .WhenInjectedInto<ShipStateFactory>() .WithInitializable();
你也可以选择在ShipStateFactory创建状态实例后,手动调用Initialize()方法。
内容的提问来源于stack exchange,提问作者gazoon007
相关产品推荐
相关产品推荐

