2016-04-06 73 views
2

我使用guice來注入依賴關係。如何在guice提供程序中使用guice注入器?

我有這樣的供應商:

public class RequestUrlRepository implements Provider<IRequestUrlRepository> { 


    @Singleton 
    @Override 
    public IRequestUrlRepository get() { 
     IRequestUrlRepository answer = null; 
     if (System.getProperty("").equals(RouteOrCostRequest.cost.toString())){ 
      answer = new CostRequestUrlRepository(...); 
     } 
     else 
     { 
      answer = new RoutingRequestUrlRepository(...); 
     } 
      return answer; 
    } 
} 

我如何使用吉斯注射器填充new CostRequestUrlRepository(...);new RoutingRequestUrlRepository(...)當它在供應商?

如果不可能,我如何在不手動創建所有ctor參數的情況下啓動它們?

回答

3

提供商可以接受@Inject -annotated構造和領域,Guice的內置綁定會讓你既注入和Injector一個供應商對任何關鍵噴油器可以提供(例如Provider<CostRequestUrlRepository>)。

@Singleton 
public class RequestUrlRepository implements Provider<IRequestUrlRepository> { 

    @Inject Provider<CostRequestUrlRepository> costRepositoryProvider; 
    @Inject Provider<RoutingRequestUrlRepository> routingRepositoryProvider; 
    @Inject Injector injector; 

    @Override public IRequestUrlRepository get() { 
     IRequestUrlRepository answer = null; 
     if (System.getProperty("").equals(RouteOrCostRequest.cost.toString())){ 
      return costRepositoryProvider.get(); 
     } else { 
      return routingRepositoryProvider.get(); 
     } 

     // Alternatively: 
     return injector.getInstance(Class.forName(System.getProperty(""))); 
    } 
} 

請注意@Singleton註釋在類而不是方法;每個Guice郵件列表「範圍註釋適用於提供者作爲整體,使用@Singleton註釋get()方法是錯誤的並且被忽略。」 (link)。理想情況下,不是注射整個注射器,而是注射每個供應者;而不是注射整個注射器。這應該會讓你更容易看到你的系統的依賴關係,然後你就更少依賴Guice,而更多地依賴一般的JSR330註釋。但是,如果您必須基於變量中的名稱或類字面值來實例化任意類,那麼注入Injector就是一種方法。

+0

我試圖啓動'costRepository'和'routingRepository'來填充'IRequestUrlRepository'接口。我認爲我不應該爲每個人編寫提供程序 –

+0

對於任何綁定到'X','Provider '或'@Provides X',Guice都會自動創建一個Provider或自動調用'provider.get()' 。無需爲存儲庫編寫自己的提供程序。 –