Опциональная инъекция в Guice
Можно ли сказать Guice, что нет необходимости вводить все аргументы конструктора? Например, у меня есть конструктор Foo
это занимает два аргумента типов Bar
а также Baz
, Все они не являются обязательными в моей системе: они могут
- оба присутствуют
- оба отсутствуют
- только
Bar
подарок - только
Baz
подарок.
Тем не менее, это зависит от других модулей, обеспечивающих эти привязки. Я хочу получить что-то вроде этого:
class Foo {
private final Bar bar;
private final Baz baz;
@Inject(optional = true)
public Foo(@Nullable Bar bar, @Nullable Baz baz) {
this.bar = bar;
this.baz = baz;
}
}
Но я не могу по-настоящему использовать optional
с конструкторами. Есть способ сделать это?
2 ответа
Я думаю, что предпочтительным шаблоном Guice для этого является:
public class HolderPatter {
static class Bar {
@Inject Bar(BarDependency dependency) {}
}
static class Baz {
@Inject Baz(BazDependency dependency) {}
}
static class BarHolder {
@Inject(optional=true) Bar value = null;
}
static class BazHolder {
@Inject(optional=true) Baz value = null;
}
static class Foo {
private final Bar bar;
private final Baz baz;
@Inject
public Foo(BarHolder bar, BazHolder baz) {
this.bar = bar.value;
this.baz = baz.value;
}
}
}
Обратите внимание, что это также позволит вам указать вменяемые значения по умолчанию...
Последняя версия Guice недавно добавлена OptionalBinder
который работает лучше, чем@Inject(optional=true)
метод, а также добавляет несколько дополнительных функций.
Смотрите также тему гдеOptionalBinder
было объявлено.