Правильный способ введения зависимостей? - PullRequest
0 голосов
/ 26 февраля 2012

Какой из них лучший способ ввести мои зависимости?Зачем?В чем разница между ними?

public abstract class Service {

    private IConfig config;

    @Inject
    public Service(IConfog config) {
        this.config = config
    }
}

Или

public abstract class Service {

    @Inject private IConfig config;

    @Inject
    public Service() {

    }
}

Ответы [ 3 ]

4 голосов
/ 26 февраля 2012

Внедрение в конструктор (1-е) предпочтительнее, чем встраивание в сеттер, поскольку оно облегчает поддержку «неизменяемых» сущностей или сущностей, поведение которых четко определено и не модифицируется после построения. Конструктор vs Setter inject

Для меня эмпирическое правило - сначала предпочесть инъекцию конструктора и перейти к установке setter, если инжектор конструктора требует, чтобы я согнул спину, т. Е. При работе с устаревшим кодомМетоды "получения и установки ООП".

РЕДАКТИРОВАТЬ: Я предполагаю, что вы пытаетесь сделать выбор между конструктором "конструктор" и "сеттер".Но также кажется, что вы используете абстрактные классы, которые не могут быть созданы.Может быть, вы имеете в виду что-то еще?

3 голосов
/ 26 февраля 2012

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

Обычно я делаю это следующим образом:

public abstract class AbstractService {

  private IConfig config;

  public AbstractService(IConfog config) {
    this.config = config
  }
}

public class Service extends AbstractService {
  @Inject
  public Service(IConfig config) {
    super(config);
  }
}

Теперь вы можете использовать оба класса с внедрением зависимостей и без него (создайте его вручную, передавая все необходимые ссылки).Также вы можете быть уверены, что Сервис создается каждый раз в соответствующем состоянии.

1 голос
/ 26 февраля 2012

Основная цель внедрения зависимостей - упростить модульное тестирование, позволяя выполнять

Service serviceToTest = new Service(mockConfig);

или

Service serviceToTest = new Service();
serviceToTest.setConfig(mockConfig);

Второй способ внедрения зависимостей делает невозможным выполнениеabover.Вы можете только протестировать его, позволив Guice создать сервис и внедрить фиктивную зависимость, или используя отражение, чтобы установить фиктивную зависимость.

...