如何在单个ManaGraphics脚本中使用不同Inject ID注入ManaManager?
可行的实现方案
方案1:注入容器并手动解析对应实例
无需子类化,直接在ManaGraphics中注入DiContainer,再通过传入的Team参数解析对应ID的ManaManager:
public class ManaGraphics { private ManaManager _manaManager; // 注入容器,同时传入目标阵营 [Inject] public void Setup(DiContainer container, Team targetTeam) { _manaManager = container.Resolve<ManaManager>(targetTeam); // 此处初始化UI绑定逻辑,比如监听 mana 变化事件 } }
绑定ManaGraphics时指定阵营参数:
public override void InstallBindings() { // 原有ManaManager绑定保持不变 Container.Bind<ManaManager>().WithId(Team.Ally).AsSingle(); Container.Bind<ManaManager>().WithId(Team.Enemy).AsSingle(); // 绑定己方ManaGraphics,传入Ally阵营 Container.Bind<ManaGraphics>().AsSingle().WithArguments(Team.Ally); }
后续若需添加敌方UI,只需新增一行绑定:
Container.Bind<ManaGraphics>().WithId(Team.Enemy).AsSingle().WithArguments(Team.Enemy);
方案2:使用工厂模式创建实例
通过工厂类封装ManaGraphics的创建逻辑,根据传入的Team自动匹配对应的ManaManager:
public class ManaGraphicsFactory { private readonly DiContainer _container; [Inject] public ManaGraphicsFactory(DiContainer container) { _container = container; } public ManaGraphics Create(Team team) { var manaManager = _container.Resolve<ManaManager>(team); return new ManaGraphics(manaManager); } } // 修改ManaGraphics构造函数,直接接收ManaManager实例 public class ManaGraphics { private readonly ManaManager _manaManager; public ManaGraphics(ManaManager manaManager) { _manaManager = manaManager; // 初始化UI逻辑 } }
使用时注入工厂并创建实例:
// 在需要创建ManaGraphics的类中 [Inject] private ManaGraphicsFactory _factory; void Start() { // 创建己方ManaUI var allyManaGraphics = _factory.Create(Team.Ally); // 挂载到对应UI节点 }
方案3:利用Zenject的上下文绑定(可选)
如果项目使用场景上下文或其他子容器,可以为不同阵营创建独立上下文,但这种方式适合复杂场景,当前需求下前两种方案更轻量。
为什么不推荐子类化
子类化会导致代码冗余,后续需要支持敌方UI时,又要复制几乎相同的代码到EnemyManaGraphics,维护成本高,也不符合DRY(Don't Repeat Yourself)原则。
内容的提问来源于stack exchange,提问作者Franco Soler
相关产品推荐
相关产品推荐

