2015-06-19 71 views
2

我有一個Guice注入一些其他服務的託管服務。其他服務的使用取決於傳遞給我的服務方法的鍵值。所以,我想打一個Map映射服務來使用相應的鍵:使用Guice注入Map的值

@Inject 
private IServiceA serviceA; 

@Inject 
private IServiceB serviceB; 

private Map<String, IService> mapping; 

private Map<String, IService> getMapping() { 
    if (mapping == null) { 
     mapping = new HashMap<String, IService>(); 
     mapping.put("keyA", serviceA); 
     mapping.put("keyB", serviceB); 
    } 
} 

@Override 
public void myServiceMethod(String key) { 
    IService serviceToUse = getMapping().get(key); 
    // ... use some methods of the identified service 
} 

該解決方案的工作,但似乎尷尬,因爲我必須有映射的這種延遲初始化。我嘗試使用static塊,但實例成員尚未由Guice初始化。

我寧願直接向Guice注入映射值,但我不知道如何實現這一點。

+1

我可能會偏離主題,你可能會考慮使用不同的模式:你可以* @提供*你的IService類,並使用@Named註釋來映射它們中的每一個 – Joel

回答

4

只需使用MapBinder,例如,

protected void configure() { 
    MapBinder<String, IService> mapBinder = MapBinder.newMapBinder(binder(), String.class, IService.class); 
    mapBinder.addBinding("keyA").to(IServiceA.class); 
    mapBinder.addBinding("keyB").to(IserviceB.class); 
} 

然後你注入整個地圖,例如,

public class IServiceController { 
    @Inject 
    private Map<String, IService> mapping; 
}