簡體   English   中英

配置類 - 使用Guice的最佳實踐

[英]Configuration class - best practice with Guice

背景:我正在使用Google Guice,因此更容易通過配置類,但我認為這不是最好的方法。

我有一個存儲一些路徑的配置類:

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

我還有一個類“a”需要“homepath”和一個類“b”需要“userpath”。

是通過類a和b的構造函數傳遞配置類還是僅通過特定路徑更好?

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

  1. 刪除配置類。
  2. 創建注解類,大概是叫HomePathUserPath
  3. 其中類a使用getHomePath()將其替換為名為homePath的String字段成員。
  4. 其中類b使用getUserPath()將其替換為名為userPath的String字段成員。
  5. 將類a和b構造函數修改為@Inject annotated(應該已經是)並接受一個String參數,分別用@HomePath@UserPath注釋並分配注入值的String字段成員。
  6. 在模塊的configure方法中創建綁定使用.annotatedWith()來定義正確的值; 如果它們僅在運行時可用,請綁定提供程序。

例如

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注釋Guice。

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

如果沒有傳遞Configuration類使得a或b對用戶編寫的類沒有依賴關系,或者為了避免依賴循環,則使用各個路徑字符串。 否則,如果更有意義地說'此類可以訪問配置信息,以某種可能在將來發生變化的方式',則傳遞該類。

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

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

如果您知道您的Configuration類將會增長並且如果您的AB類可能會使用更多,那么將整個Configuration對象傳遞給它們的構造函數。 注意:我知道這違反了YAGNI原則,但有時你可能知道你會需要它;-)

否則,您可以考慮使用@Named注入路徑,以便將AB類依賴性降低到最小值,這是一個很好的設計實踐。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM