2017-02-08 3 views
0

Мне нужно несколько экземпляров X, которые вводятся в разных местах. Я внедрил пользовательский поставщик Guice для предоставления различных экземпляров класса X следующим образом.DRY Custom Guice Provider с параметрами

public class XProvider implements Provider<X> { 
    private final Factory f; 
    private final String NAME = "Something String"; 

    @Inject 
    public XProvider(Factory f) { 
     this.f = f; 
    } 

    public X get() { 
     return new X(f, NAME); 
    } 
} 

Потому что нужен другой экземпляр X с другим значением NAME, мне нужно иметь несколько подобных классов как XProvider1, XProvider2 и т.д., которые только разные в одном поле. Создание абстрактного класса для расширения не помогает уменьшить количество избыточного кода, потому что (1) скрытие поля не является хорошим (2) Если я не скрываю поле, мне все равно нужно иметь конструктор в подклассе в любом случае ,

Я не могу использовать Assisted Injection, потому что у меня нет X, поэтому я меняю его конструктор.

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

Спасибо,

ответ

1

Если вы заранее ограниченный набор возможных аргументов, вы можете использовать именованные @Provides привязки модуля Guice:

@Provides @Named("Type 1") MyClass getType1() {return new MyClass("Param of type 1");} 
@Provides @Named("Type 2") MyClass getType2() {return new MyClass("Param of type 2");} 

, а затем вводят его с именами

@Inject @Named("Type 1") 
private MyClass instance, anotherInstance; 

пс. Вы можете передавать любые параметры для инъекций в методы @Provides, то есть getType2 (Factory factory) {return ...

+0

Спасибо. Это работает. – chepukha

Смежные вопросы