Кинжал 2 - Понимание различных способов внедрения поля и метода - PullRequest
0 голосов
/ 29 декабря 2018

Я понимаю, что внедрение конструктора должно быть предпочтительным, когда это возможно, но для теоретического понимания я хочу больше узнать о внедрении полей и методов.

Внедрение метода, по-видимому, очень редко, и, согласно Джейку Уортону,Единственный вариант его использования - это когда вам нужно передать экземпляр зависимого объекта в зависимость (поскольку он может быть еще не полностью создан в конструкторе).

Пример для внедрения метода:

@Inject

public void enableStreaming(Streaming streaming) {

    streaming.register(this);

}

Поле & метод Процесс внедрения в зависимый объект может быть запущен двумя способами:

  1. Либо в комбинации свнедрение конструктора , в этом случае оно выполняется автоматически после запуска конструктора (нет необходимости вызывать inject для компонента).Это то, что происходит в приведенном выше примере (я опустил конструктор, представьте, что он @Inject аннотирован)
  2. Без внедрения конструктора , когда объект уже создан.В этом случае нам нужен метод инъекции членов, где мы передаем объект.Поля / метод затем будут внедрены, когда мы вызываем component.inject(object) Это наиболее часто используется для внедрения полей в действиях и фрагментах.

То, что я прошу, являются примерами для противоположных случаев.

  1. У вас есть примеры, когда поле инъекция комбинируется с инжектором конструктора?
  2. Есть ли у вас примеры, когда метод инъекция не в сочетании с инжектором конструктора (и поэтому нуждается в явном вызове inject)?
  3. В обоих случаях я хотел бы знать, существуют ли ситуации, когда component.inject() метод вызывается извне или изнутри объекта и каковы варианты использования для этого.Есть ли когда-нибудь сценарий, в котором мы вызываем

    ExampleObject exampleObject = new ExampleObject(); component.inject(exampleObject);

для выполнения внедрения поля или метода в exampleObject?

1 Ответ

0 голосов
/ 09 января 2019

У меня нет удобных опубликованных или официальных примеров, но все описанные вами ситуации работают нормально.Необычно, когда инжекция поля комбинируется с инжекцией конструктора, потому что поля обязательно не являются final для работы с инжекцией поля, где они могут быть окончательными, если передаются через конструктор.Менее необычно видеть внедрение метода без внедрения конструктора, для случаев саморегистрации, аналогичных описанному выше методу enableStreaming, но это все же несколько необычный вариант использования.

Хотя поле ивнедрение метода может происходить внутри внедряемого метода или класса, это потребует получения конкретного экземпляра компонента или MembersInjector<T> для вашего класса T, что по меньшей мере так же сложно вызвать, как component.inject(exampleObject) в третьем примере.выше.В конце концов, весь смысл внедрения зависимостей состоит в том, чтобы позволить вызывающей стороне контролировать зависимости класса, так что это, возможно, ослабление DI для класса-владельца, чтобы контролировать, предоставляются ли и как его зависимости.

Единственные случаи, когда я могу придумать, где класс будет управлять своим собственным внедрением, - это если ваш класс хотел бы ввести себя условно - if (BuildOptions.FEATURE_X_ENABLED) { injector.inject(this); }, - но на ум приходит много других шаблонов, которые лучше справятся с этим типом случаев.

...