我正在开发一个使用 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 来绑定依赖项。