Guice有以下問題:單身服務,注入上下文敏感信息的提供者。到現在爲止,背景下只涉及到Servlet請求,所以我用一個@RequestScoped提供商,而我這個注射提供商的服務,像這樣:使用來自兩個不同範圍的提供者
@RequestScoped
public class ContextProvider<IContext> implements Provider<IContext> {
@Override
public IContext get() { ... } // returns context
}
@Singleton
public class ServiceImpl implements IService {
@Inject
private Provider<IContext> contextProvider;
}
這工作正常。現在,我正在爲應用程序添加後臺任務處理。後臺任務不是從Web請求發起的,所以我不能使用ServletScopes.scopeRequest(..)。我已經編寫了一個自定義範圍(幾乎是Giuce doc中BatchScoped的精確副本),以使每個任務都在其自己的範圍內運行。現在的問題是 - 如何使BatchScoped ContextProvider和配置Guice使用它?
我做了這樣的嘗試與結合EDSL:
line 1 : bind(IContext.class).toProvider(ContextProvider.class).in(RequestScoped.class);
line 2 : bind(IContext.class).toProvider(BatchContextProvider.class).in(BatchScoped.class);
但吉斯告訴我,第2行是「A結合IContext已經配置在第1行」。
問題是:用Guice做這種注射的正確方法是什麼?
我不明白你爲什麼不能使用'ServletScopes.scopeRequest()',這正是它的設計目的。 – 2014-12-06 22:39:01
我無法使用它,因爲後臺任務不是從Web請求發起的。所以沒有RequestScope是可用的。 – execc 2014-12-07 10:37:46
你試過了嗎?我認爲你會發現'scopeRequest()'做的是:它會產生一個「假」請求範圍。 – 2014-12-07 17:21:16