2011-09-16 63 views
4

背景:我使用Google Guice,因此通過配置類更容易,但我認爲這不是最好的方法。配置類 - Guice的最佳實踐

我有存儲一些路徑的配置類:「A」,這需要「HOMEPATH」和「B」類,其需要「userpath」

class Configuration{ 
    String getHomePath(); 
    String getUserPath(); 
} 

另外我有一個類。

將配置類傳遞給類a和b的構造函數還是隻傳遞給特定的路徑會更好嗎?

回答

1

根據您的具體情況,您的問題沒有單一的答案,只有可供選擇的選項。

如果你知道你的Configuration類是要長大,如果它有可能爲你AB類將使用更多來自它,那麼整個Configuration對象傳遞給它們的構造。注:我知道這是對YAGNI原則,但有時你可能知道你會需要它;-)

否則,讓你減少AB類依賴於你可以考慮使用@Named注入你的路他們最低限度,這是一個很好的設計實踐。

1

一般規則是使依賴關係圖(哪些類知道或依賴於其他類/接口)儘可能簡單,規則和固定的代碼。

如果不通過配置類使a或b對用戶編寫的類沒有依賴關係,或者爲避免依賴關係循環,則使用單個路徑字符串。否則,如果說'這個班級有權訪問配置信息,以一種可能在將來會改變的方式'更合理,請通過班級。

我會避免單例方法,特別是如果你已經有Guice設置。

3

如果你真的正確使用Guice,你所有的配置都應該出現在模塊的configure方法中。所以:

  1. 刪除配置類。
  2. 創建註釋類,可能稱爲HomePathUserPath
  3. 其中a類使用getHomePath()將其替換爲名爲homePath的String字段成員。
  4. 如果b類使用getUserPath()將其替換爲名爲userPath的String字段成員。
  5. 將類a和b的構造函數修改爲@Inject進行了註釋(應該已經是)並帶入一個字符串參數,分別用@HomePath@UserPath註釋,並指定注入值的String字段成員。
  6. 在模塊的配置方法中使用.annotatedWith()創建綁定,這些綁定定義了正確的值;如果它們僅在運行時可用,則綁定提供者。

E.G.

class a { 
    private String homePath; 
    @Inject 
    public a(@HomePath String homePath) { 
    this.homePath = homePath; 
    } 
    public String tellMeAboutHome() { 
    return "We live in a nice home called " + homePath; 
    } 
} 

class customModule extends AbstractModule { 
    public static final String userPath = "/home/rafael"; 

    public void configure() { 
    bind(String.class).annotatedWith(HomePath.class).to("/home/"); 
    bind(String.class).annotatedWith(UserPath.class).to(userPath); 
    } 
} 

如果創建的註釋是對你工作太多了,使用@Named標註吉斯ships with