2017-02-23 141 views
1

我有兩個活動吉斯實例不同類別與不同的供應商

public class GetActivity 
{ 
    ChildClass childclass; 

    @Inject 
    public GetActivity(ChildClass childClass) 
    { 
     this.childClass = childclass; 
    } 
    String id = childClass.get(id); 
    .... 
} 

public class SaveActivity 
{ 
    ChildClass childclass; 

    @Inject 
    public SaveActivity(ChildClass childClass) 
    { 
     this.childClass = childclass; 
    } 
    childClass.save(id); 
    .... 
} 

ChildClass是使用以下方法

public interface ChildClass 
{ 
    String get(id); 
    void save(id); 
} 

和接口其作爲下列

public class ChildClassImpl implements ChildClass 
{ 
    String storage; 

    public ChildClassImpl(String storage) 
    { 
     this.storage =storage; 
    } 

    String get(Id) 
    { 
     someOtherObject.get(id, storage); 
    } 

    void save(id) 
    { 
     someOtherObject.save(id, storage); 
    } 
} 

我實現寫提供商將返回ChildClass方法

public class ChildClassProvider1 implements Provider<ChildClass> 
{ 
    @Override 
    public ChildClass get() 
    { 
     ChildClass childClass = new ChildClass("hello"); 
    } 
} 

public class ChildClassProvider2 implements Provider<ChildClass> 
{ 
    @Override 
    public ChildClass get() 
    { 
     ChildClass childClass = new ChildClass("secondHello"); 
    } 
} 

我想確保GetActivity和SaveActivity與提供程序ChildClassProvider1初始化,但其他類應使用ChildClassProvider2。如何用guice實現這一點?

回答

1

有幾個選項,取決於你想把這個需求燒成你的代碼的難度。

首先,通過提供方法在您的模塊:

class YourModule extends AbstractModule { 
    @Override protected void configure() { 
    bind(ChildClass.class).toProvider(ChildClassProvider1.class); 
    } 

    @Provides SaveAction saveAction(ChildClassProvider2 provider) { 
    return new SaveAction(provider.get()); 
    } 
} 

其次,經由結合註釋 或者,提供的結合註釋:

@BindingAnnotation @Retention(RUNTIME) 
@interface YourAnnotation {} 

然後:

// Ctor of SaveActivity. 
@Inject 
public SaveActivity(@YourAnnotation ChildClass childClass) { ... } 

// In your module: 
bind(ChildClass.class).annotatedWith(YourAnnotation.class) 
    .toProvider(ChildClassProvider2.class); 

第二個選項是「更難烘烤」,因爲您必須將裝訂代碼中的符號;但它不那麼脆弱(從某種意義上說,你不必顯式調用構造函數),並且感覺「更加guice-y」。

第一種選擇是讓它稍微寬鬆一點,如果你想在某些情況下能夠配置不同的東西。

+0

我不明白你的第一個方法,你詳細說明一下。 – Schumi

+0

https://github.com/google/guice/wiki/ProvidesMethods –