Как внедрить в Guice, когда есть два разных конструктора? - PullRequest
2 голосов
/ 03 декабря 2009

Total Guice noob здесь, прочитал несколько статей и посмотрел вступительное видео, вот и все.

Вот мой упрощенный старый код, который я пытаюсь "выучить". Не могу понять, как, поскольку (насколько я понимаю) я могу только @inject -аннотировать один из двух конструкторов? Как вызывающий класс может создать тот или иной экземпляр? Или мне придется как-то это изменить?

public class MyDialog extends JDialog {
    public MyDialog( JFrame parent, <other parameters...> ) {
        super( parent );
    }

    public MyDialog( JDialog parent, <other parameters...>) {
        super( parent );
    }
 }

Ответы [ 3 ]

4 голосов
/ 04 декабря 2009

Вы можете вводить только в один ctor.

В зависимости от того, как используется этот класс, вы можете:

  • Внедрить фабрику в код клиента двумя «новыми» методами.
  • Свернуть все аргументы в один ctor и передать NULL, когда не требуется.

Как вызывающий класс может создать тот или иной экземпляр?

Это говорит о том, что вызывающим классам понадобится несколько экземпляров MyDialog? Затем вам нужно использовать фабрику, изготовленную вручную (Assisted Inject может с этим справиться, если у вас только один ctor). Я не знаю деталей того, чем вы занимаетесь, и я, вероятно, повторяю то, что вы уже знаете, но в качестве пустого заявления я бы предложил также извлечь интерфейс из MyDialog и заставить фабрику вернуть их. Таким образом, вы можете подделать MyDialog в тестах.

1 голос
/ 15 декабря 2009

Конструктор впрыска очень чистый. mlk прав, говоря, что вы можете вводить только в один конструктор.

Что вы можете сделать, это использовать метод инъекции:

public class Smt {

    private int a;
    private Cereal cereal;
    private Personality personality;
    private ignition;

    public Smt() {
        this.a = 5;
    }

    public Smt(int a) {
        this.a = a;
    }

    @Inject
    public void setup(@CiniMini Cereal cereal, @Rastafarian Personality personality,
        Ignition ignition) {
        this.cereal = cereal;
        this.personality = personality;
        this.ignition = ignition;
    }
}

Что Guice будет делать, так это вызвать метод класса setup вашего класса и предоставить все инъекции. Затем вы делаете то же самое, что и в конструкторе - назначаете объекты атрибутам вашего класса.

0 голосов
/ 23 августа 2012

Я согласен с предыдущими комментариями. Просто дополнительная подсказка: предполагается, что внедрение конструктора обеспечивает все зависимости, в которых нуждается класс. Как говорит mlk, одним из подходов может быть аннотирование конструктора большинством аргументов, а затем рефакторинг другого для вызова первого, передавая нулевые значения там, где это необходимо.
Кроме того, Guice 3.0 поддерживает так называемые привязки конструктора , которые позволяют программисту указывать, какой конструктор использовать. Подробнее см. здесь .

...