2014-02-12 51 views
0

我使用的吉斯4.0 Beta 2的一個新項目。吉斯:如何使用的實例,而不是供應商的時候我已經使用吉斯3.0以前的項目後,已經有實例

在我目前的項目有使用ApplicationConfigurationProvider這是從HTTP請求得到的ApplicationConfiguration對象:

@Inject 
    public ApplicationConfigurationProvider(HttpServletRequest request) 
    { 
    this.request = request; 
    } 

    @Override 
    public ApplicationConfiguration get() 
    { 
    ApplicationConfiguration app = null; 

    Map<String, ApplicationConfiguration> appMap = 
      (Map<String, ApplicationConfiguration>) request.getSession() 
      .getServletContext() 
      .getAttribute(ContextKeys.APPLICATION_CONFIGURATIONS.toString()); 

    //get the host..... 
    String host = request.getServerName(); 
    if(host.equals("localhost")) 
    { 
     app = appMap.get("abcclient"); 
    } 
    else 
    { 
     app = appMap.get("xyzclient"); 
    } 

    return app; 
    } 

的結合看起來是這樣的:

bind(ApplicationConfiguration.class).toProvider(ApplicationConfigurationProvider.class).in(RequestScoped.class); 

到目前爲止好。這按預期工作。請注意,其他Provider類取決於將ApplicationConfiguration注入到它們中。

這是我在遇到麻煩:我需要發生一些批處理。批處理不是由HTTP請求啓動的。我擁有正確的ApplicationConfiguration實例(它並不需要通過使用HTTP請求來選擇),但我不知道如何綁定這一點,或者告訴噴油器使用這個實例,而不是ApplicationConfigurationProvider

我想我可以創建一個自定義作用域,並使用我想用於該作用域的ApplicationConfiguration實例來創建自定義作用域,但它不起作用。我使用Guice wiki上的示例創建了自定義範圍。

我想我可以將ApplicationConfiguration綁定到其他類型的Provider在自定義範圍內,但這也不起作用,因爲Guice只允許一個特定的鍵被綁定一次。總之,我需要將ApplicationConfiguration綁定到我在「批處理」模式下(當我有它在請求之外可用時)已經擁有的特定實例,並且在HTTP請求中使用ApplicationConfiguratoniProvider時,我需要綁定ApplicationConfiguration。我希望如果我有ApplicationConfiguration實例,它將被注入的其他提供程序將像現在這樣工作(當處於HTTP請求中時)。

我怎麼能這樣做?

謝謝!!!!

-Ryan

+0

您是否在注射器創建時知道您是否處於「批處理」模式? –

+0

我可以。我想現在我的計劃是使用子注入器,一個用於ApplicationConfiguration的每個實例。父注入器將使用所有「標準」綁定,而子注入器將使用特定於ApplicationConfiguration的綁定。所以在HTTP請求中,我只需選擇合適的注入器,而不是使用Provider來選擇正確的ApplicationConfiguration。而在批處理模式下,我會選擇正確的注射器。聲音可行嗎? – user3303372

+0

不,父注入器中的對象不能從子注入器獲得依賴關係。但有一個解決方案,我會把它作爲答案。 –

回答

0

好吧,我想通了。

我真正想要做的是重新使用RequestScope外的HTTP請求的,但我並不認爲這是容易實現。事實證明它是,而我所需要的方法是ServletScopes.scopeRequest

在吉斯論壇此言究竟是什麼導致我在正確的道路上:

https://groups.google.com/d/msg/google-guice/ozexD9etcXI/40kbz1PDdIEJ

我與幾個要求接種的seedMap作用域在噴油器的綁定中定義的變量,創建Callable如圖所示,它的工作!

這裏的JavaDoc,它說的是scopeRequest方法不正是我想要它做的事:

http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/servlet/ServletScopes.html

謝謝大家的幫助!

1

有很多方法可以解決這個問題。如果您知道應用程序是否在「批量」模式,並在啓動正常模式下,你可以這樣做:

@Override 
public void configure() { 
    if (isInBatchMode) { 
     bind(ApplicationConfiguration.class) 
       .toInstance(batchInstance); 
    } else { 
     bind(ApplicationConfiguration.class) 
       .toProvider(ApplicationConfigurationProvider.class) 
       .in(RequestScoped.class); 
    } 
} 

isInBatchModebatchInstanceModule傳遞。或者你也可以做出兩個不同的模塊,並根據配置不同的安裝者等

您也可以編寫從請求,如果你是一個HTTP請求中返回實例自定義提供,而「批量」否則實例。您可以使用自定義過濾器檢查您是否處於HTTP請求中。