Что не так с моим DI?- Внедрение зависимостей, Unity - Пустая ссылка только после внедрения - PullRequest
0 голосов
/ 25 февраля 2019

Я новичок в внедрении зависимостей и уже несколько дней занимаюсь исследованиями, но, похоже, не могу найти ответы;там не так много примеров, специфичных для 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."));

    }
}

Попытка изменить его, чтобы сделать то же самое по-другому в программе установки;тот же результат был достигнут, заставив меня думать, что проблема связана с моим установщиком, и он не был правильно привязан ни к одной из моих попыток.

...