我是依赖注入的新手,我已经做了几天的研究,但似乎找不到答案;没有很多特定于 zenject 的示例,因此我一直在研究特定的 zenject 解决方案以及一般的 DI。
使用 Unity 2018.3f 和 Zenject 7.3.1。
我正在使用接口 IModifiableService 来构造函数将我的 ModifiableService 类注入到我的 ModifiableField 类中以填充它的依赖项。
在构造函数的控制台登录期间,它按预期注销“ModifiableService”。当在从 ModifiableField 脚本调用以触发 Calculate() 的单独方法中再次使用时,控制台日志为空。我似乎遗漏了一些东西或做错了,所以我非常感谢任何资源或建议,以便更好地理解 DI 以及如何解决我的问题。谢谢!
public class ModifiableField
{
[SerializeField] private ModifiableProperty propertyToModify;
[SerializeField] private float modificationAmount;
[SerializeField] private IModifiableService _modifiableService;
ModifiableField(IModifiableService modifiableService)
{
_modifiableService = modifiableService;
//Not Null
Debug.Log(_modifiableService);
}
public IModifiableService ModifiableService { get => _modifiableService; private set => _modifiableService = value; }
public ModifiableProperty PropertyToModify { get => propertyToModify; private set => propertyToModify = value; }
public float ModificationAmount { get => modificationAmount; private set => modificationAmount = value; }
public void Calculate()
{
//Null
Debug.Log(_modifiableService);
ModifiableService.TriggerAttributeChange(PropertyToModify);
}
}
捆绑:
public class MISInstaller : MonoInstaller
{
public override void InstallBindings()
{
SignalBusInstaller.Install(Container);
//Both of these lines to bind IModifiableService produce the same null result.
//Container.BindInterfacesAndSelfTo<ModifiableService>().AsCached().NonLazy();
//Container.Bind<IModifiableService>().To<ModifiableService>().AsCached().NonLazy();
Container.Bind<ModifiableField>().AsTransient().NonLazy();
Container.DeclareSignal<ModAgilitySignal>();
Container.DeclareSignal<ModStrengthSignal>();
Container.BindInterfacesAndSelfTo<ModAgilitySignal>().AsCached().NonLazy();
Container.BindInterfacesAndSelfTo<ModStrengthSignal>().AsCached().NonLazy();
Container.BindSignal<ModAgilitySignal>().ToMethod(() => Debug.Log("Agility Modifiable Signal Fired."));
Container.BindSignal<ModStrengthSignal>().ToMethod(() => Debug.Log("Strength Modifiable Signal Fired."));
}
}
尝试将其更改为在安装程序中以不同的方式执行相同的操作;实现了相同的结果,让我认为我的安装程序是问题所在,并且在上述任何一次尝试中都没有正确绑定。