Zenject Unity3D - 从游戏对象层次结构注入依赖项

问题描述 投票:0回答:0

我正在开发一个使用 Zenject 进行依赖注入的 Unity3D 项目。在我的项目中,我有一个 UpgradeCardButton 组件,它注入了 ButtonUpgradeCommand 对象。

ButtonUpgradeCommand 使用类型为 UpgradeCardVisual 的对象和枚举 Enums.UpgradeType.

构造

UpgradeCardVisual 对象与层次结构中的 UpgradeCardButton 对象驻留在同一转换中,并且可以通过 GetUpgradeType() 从 UpgradeCardButton 对象读取要注入到 ButtonUpgradeCommand 的特定 Enums.UpgradeType方法。

我当前的实现当前使用 FromMethod(),它查看 ParentContext 并将该对象转换为 UpgradeCardButton,然后执行通用操作来访问所需的依赖项。

我的问题是,我当前的实现并没有真正意义,因为解决这些依赖关系涉及转换对象和使用基本 MonoBehaviour 方法,是否有更简洁的方法来获取对嵌套依赖关系时所需的对象的引用?

以下是所涉及文件的源代码:

UpgradesInstaller:此 Zenject 安装程序类负责设置依赖项绑定。

public class UpgradesInstaller : MonoInstaller
    {
        public override void InstallBindings()
        {
            Container.Bind<IUpgradeCommand>().To<ButtonUpgradeCommand>().AsTransient();
            Container.Bind<UpgradeCardVisual>().FromMethod(GetVisualFromButtonUpgrade).AsTransient();
            Container.Bind<Enums.UpgradeType>().FromMethod(GetUpgradeTypeFromButtonUpgrade).AsTransient();
        }

        private UpgradeCardVisual GetVisualFromButtonUpgrade(InjectContext context)
        {
            // Get the UpgradeCardButton component from the context
            UpgradeCardButton upgradeButton = context.ParentContext.ObjectInstance as UpgradeCardButton;

            // Return the UpgradeCardVisual component obtained from the UpgradeCardButton
            return upgradeButton.transform.GetComponent<UpgradeCardVisual>();
        }

        private Enums.UpgradeType GetUpgradeTypeFromButtonUpgrade(InjectContext context)
        {
            // Get the UpgradeCardButton component from the context
            UpgradeCardButton upgradeButton = context.ParentContext.ObjectInstance as UpgradeCardButton;

            // Return the upgradeType obtained from the UpgradeCardButton
            return upgradeButton.GetUpgradeType();
        }
    }

ButtonUpgradeCommand:此类表示执行升级的命令,需要从 UpgradeCardButton 注入依赖项。

public class ButtonUpgradeCommand : IUpgradeCommand
{
        // Injected dependencies
        private UpgradeCardVisual _upgradeVisual;
        private Enums.UpgradeType _upgradeType;

        // Constructor injection
        public ButtonUpgradeCommand(UpgradeCardVisual upgradeVisual, Enums.UpgradeType upgradeType)
        {
            _upgradeVisual = upgradeVisual;
            _upgradeType = upgradeType;
        }

        // Methods and logic for upgrades...
}

UpgradeCardButton:这个MonoBehaviour代表一个触发升级操作的按钮。它还包含要注入到 ButtonUpgradeCommand 中的依赖项。

    public class UpgradeCardButton : MonoBehaviour
    {
        [SerializeField] Enums.UpgradeType _upgradeType;
        private IUpgradeCommand _upgradeCommand;
        private IUpgradeCommand _checkCanBuyCommand;

        // Constructor injection
        [Inject]
        public void Construct(IUpgradeCommand upgradeCommand)
        {
            _upgradeCommand = upgradeCommand;
        }

        public Enums.UpgradeType GetUpgradeType() => _upgradeType;

        // Methods and logic for upgrade button behavior...
    }

我想知道是否有一种更简洁、更有效的方法来通过使用 Zenject 来绑定依赖项。

unity-game-engine dependency-injection inversion-of-control zenject
© www.soinside.com 2019 - 2024. All rights reserved.