2016-11-09 8 views
1

Допустим, что есть класс А что-х конструктор выглядит примерно так:Guice - Binding экземпляр, созданный при содействии литьевого завода

public A(@Assited long id, @Assisten String name, ServiceA serviceA, ServiceB serviceB) 

И есть AFactory:

public interface AFactory{ 

    A create(long id, String name); 
} 

Так, чтобы создать экземпляр AI, очевидно, нужно сделать что-то вроде этого:

injector = Guice.createInjector(new MyModule()); 
AFactory af = injector.getInstance(AFactory .class); 
A a = AFactory.create(100, "mike"); 

НО, Скажем, у меня есть другие классы: класс B, класс C и класс D, который имеет элемент с типом А, например (с впрыском поля, но может быть CT также):

public class B{ 
     @Inject 
     A a; 
    } 

И я хочу, чтобы тот же экземпляр из A будет введен в эти классы. Но у вас есть возможность ввести еще один экземпляр класса A в другие классы (скажем, для класса E и F).

Каков правильный способ? Я просто не могу придумать, как это сделать.

ответ

0

Вы можете структурировать свой модуль для использования Провайдеров (я использую методы @Provides ниже, но вы можете использовать полные классы или экземпляры провайдера, если хотите) и пометить согласованный A как @Singleton. Если вам нужны две привязки A (непротиворечивые и непоследовательные), по крайней мере один из них должен быть помечен обязательной аннотацией; Я использую @Named здесь из удобства, но вы можете использовать любую аннотацию привязки, как указано in the docs.

public class AModule extends AbstractModule { 
    @Override public void configure() { 
    // Install your AFactory module. Here, injections for AFactory should succeed. 
    install(new FactoryModuleBuilder().build(AFactory.class)); 
    } 

    /** 
    * Provides a singleton @Named("consistent") A. 
    * Inject @Named("consistent") A into B, C, and D; Guice will cache the instance. 
    */ 
    @Provides @Singleton @Named("consistent") 
     A provideConsistentA(AFactory factory) { 
    return factory.create(100, "mike"); 
    } 

    /** 
    * Provides an unscoped A. 
    * Inject A without an annotation into E and F; each instance will be separate. 
    */ 
    @Provides @Singleton A provideUnscopedA(AFactory factory) { 
    return factory.create(200, "jeff"); 
    } 
} 
+0

Так что, если я буду просто иметь поле в классе Е следующим образом: @Inject @Named ("последовательный") – slashms

+0

'@Inject @Named ("последовательный") fieldName', но да. И ключевым «последовательным» может быть что угодно, если вы согласны в этом. :) –