2013-09-30 4 views
1

Я хочу ввести класс A где-нибудь с GIN. Конструктор класса A требует знать идентификатор во время выполнения плюс два других класса B и C. В конструкторах B и C требуется один и тот же идентификатор A в качестве параметров.Как распространять значение во время инъекции с помощью GIN

Здесь приведен пример классов.

public class A { 
    @Inject 
    public A(String id, B b, C c) 
    { 
    ... 
    } 
} 

public class B { 
    @Inject 
    public B(String id) 
    { 
    ... 
    } 
} 

public class C { 
    @Inject 
    public C(String id) 
    { 
    ... 
    } 
} 

Как я могу распространить идентификатор на все классы во время инъекции?

Одним из решений является использование AssistedInjectionFactory с методом создания для всех трех классов, но для этого необходимо изменить конструктор, чтобы использовать фабрику для создания экземпляра B и C.

Есть другие способы использовать GIN и избежать кода шаблона конструктора A?

ответ

3

Я хотел бы использовать @Named аннотацию, и в зависимости от того, как вы хотите, чтобы вычислить значение идентификатора, метод bindConstant или Provider:

... 
@Inject public A(@Named("myId") String id, B b, C c) 
... 
@Inject public B(@Named("myId") String id) 
... 
@Inject public C(@Named("myId") String id) 


public class MyModule extends AbstractGinModule { 

    protected void configure() { 
    // You can use bindConstant and compute the id in configure() 
    String myid = "foo_" + System.currentTimeMillis(); 
    bindConstant().annotatedWith(Names.named("myId")).to(myId) 
    } 

    // Or you can use a provider to compute your Id someway 
    @Provides @Named("myId") public String getMyId() { 
    return "bar_" + System.currentTimeMillis(); 
    }  

} 
+0

Это также работает, если я хочу, чтобы создать различные экземпляры с различными идентификаторами ? – Fedy2

+1

Да, ранее для создания нового экземпляра A вы должны сказать «поставщику», каким должен быть следующий идентификатор. Например, статическим способом, например 'MyModule.nextId =" whatever ";' –

+0

Протестировано и отлично работает. – Fedy2

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