Что не так с моим DI? - Внедрение зависимостей, Unity - Пустая ссылка только после внедрения
Я новичок в Dependency Injection, и я занимаюсь исследованиями уже несколько дней, но, похоже, не могу найти ответы; там не так много примеров, специфичных для 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."));
}
}
Попытался изменить его, чтобы сделать то же самое по-другому в установщике; тот же результат был достигнут, заставляя меня думать, что мой установщик - проблема, и она не была связана правильно ни в одной из моих вышеупомянутых попыток.