我使用的吉斯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
您是否在注射器創建時知道您是否處於「批處理」模式? –
我可以。我想現在我的計劃是使用子注入器,一個用於ApplicationConfiguration的每個實例。父注入器將使用所有「標準」綁定,而子注入器將使用特定於ApplicationConfiguration的綁定。所以在HTTP請求中,我只需選擇合適的注入器,而不是使用Provider來選擇正確的ApplicationConfiguration。而在批處理模式下,我會選擇正確的注射器。聲音可行嗎? – user3303372
不,父注入器中的對象不能從子注入器獲得依賴關係。但有一個解決方案,我會把它作爲答案。 –